Возвращение переменной из функции в функции - Python

Кажется, мне трудно понять концепции передачи аргументов и возврата переменных из функции. Я работаю над проектом, включающим выдачу команд роботу через графический интерфейс Python, который я сделал с помощью протокола rest. В настоящее время я нахожусь в процессе написания отказоустойчивого кода, чтобы запретить пользователю случайное нажатие кнопки загрузки миссии несколько раз и загрузку группы одной и той же миссии. Ниже мой код:

demo = 'e1af13ba-4f38-11e7-9626-f44d3061db09'
mission = 1


def compMissionQueue():
    getMissionQueue = robot.get_mission_queue()[1][0]
    #print(getMissionQueue)
    missionID = getMissionQueue['id']
    #print(missionID)
    missionGUID = robot.get_mission_GUID_from_queue(missionID)[1]['mission_id']
    print(missionGUID)
    if missionGUID != mission:
        print('Mission successfully added to queue')
    else:
        print('Mission already in queue. Add again?')

def techDemo():
    def loadMission():
        #runDemo = robot.load_mission(demo)
        #robot.continue_robot()
        #robot.pause_robot()
        #robot.delete_from_mission_queue(demo)
        mission = demo
        return mission
    loadMission()
    compMissionQueue()
    print(mission)
    return mission

Функция techDemo запускается нажатием кнопки в графическом интерфейсе. Я пытался использовать функцию compMissionQueue, чтобы проверить, была ли миссия уже загружена в очередь, и, если это так, распечатать какое-то сообщение для пользователя. Я попытался проверить, возвращается ли значение 'mission', запустив несколько вызовов для печати, и он не возвращает mission = demo, насколько я могу судить, он всегда печатает '1' с первого раза, когда я установил миссию. Если бы вы могли указать мне правильное направление, это было бы очень ценно. Спасибо!

1 ответ

Решение

Ваша проблема в том, что вы ссылаетесь на переменную 'mission' в разных областях.

Рассмотрим этот пример:

mission = 1
def set_mission():
    mission = 2
print(mission)
set_mission()
print(mission)

Распечатает:

1
1

"миссия", похоже, не изменилась, да. Происходит то, что "миссия" - это две отдельные переменные, глобальная переменная (определенная строка 1) и локальная переменная (определенная строка 3). Локальный экземпляр существует только в области действия set_mission() и впоследствии удаляется. Когда мы устанавливаем 'mission' в 2, мы устанавливаем локальный экземпляр, а не глобальный экземпляр. Когда мы собираемся распечатать его, мы печатаем глобальный экземпляр, который никогда не трогали!

Есть два способа справиться с этим.

Опция 1

Используйте только глобальную переменную:

mission = 1
def set_mission():
    global mission
    mission = 2
print(mission)
set_mission()
print(mission)

или же

Вариант 2

Передайте переменную в качестве аргумента, затем верните ее:

mission = 1
def set_mission(my_mission):
    my_mission = 2
    return my_mission
print(mission)
mission = set_mission(mission)
print(mission)

Оба из них вернут желаемое

1
2

Будьте осторожны с областью действия, и, если сомневаетесь, используйте разные имена переменных в функциях, чтобы избежать путаницы!

Другие вопросы по тегам