Проблема передачи переменной Python3 - PullRequest
0 голосов
/ 06 декабря 2018

Пример кода, попробуйте игнорировать то, как он кажется излишне сложным - это немного глупо от реального кода, но точно имитирует поток.

def setup():
   print("Setting up...")
   do_something()

def do_something():
   task = str(input("Enter a task to do: "))
   try:
      print("Doing {}...".format(task))
   except:
      print("Failed to do {}...".format(task))
   finally:
      return task

def choose_2(choice):
   print("You chose {}".format(choice))

def menu_1():
   choice = int(input("Choose 1 or 2: "))
   if choice == 1:
      setup()
      menu_2(task)

menu_1()

Однако программа возвращает "UnboundLocalError: локальная переменная 'task', указанная перед присваиванием"

Почему do_something() не , возвращая переменную task в оператор ifв пределах menu_1()?Как только setup() (а затем do_something()) завершит работу, не должно ли возвращаемое значение do_something() оставаться внутри оператора if, поскольку это еще не сделано?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Функция setup () и menu_1 () должна быть изменена следующим образом:

def setup():
    print("Setting up...")
    do_something()

def menu_1():
   choice = int(input("Choose 1 or 2: "))
   if choice == 1:
       task=setup()
       menu_2(task)

Объяснение: menu_1 () вызывает setup (), setup () вызывает do_something ().Теперь do_something () вернет значение задачи, но вы не возвращаете его из функции setup () в menu_1 (), а затем в menu_1 () вы должны сохранить возвращенное значение в переменной с именем task.

0 голосов
/ 06 декабря 2018

Поток: menu_1() => menu_2(task)

task не определен в области действия menu_1(), поэтому его невозможно определить.

Возможно, вы намеревалисьсделайте это вместо этого:

def setup():
   print("Setting up...")
   return do_something()
.....
# in menu_1():
menu_2(setup())

Обратите внимание, что, поскольку setup теперь что-то ВОЗВРАЩАЕТ, может использоваться это возвращаемое значение.

...