【发布时间】:2019-05-08 12:07:04
【问题描述】:
示例代码,尽量忽略它看起来不必要地过于复杂 - 这是从实际代码中简化的方式,但完全模仿了流程。
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: local variable 'task' referenced before assignment”
为什么do_something()不将变量task返回到if内的if语句?一旦setup()(以及随后的do_something())完成运行,do_something() 的返回值不应该保留在if 语句中,因为它还没有完成吗?
【问题讨论】:
-
是的,您只需丢弃它。
return除了 return 一个值,而不是来自函数的 variable 之外什么都不做。menu_1中没有定义task变量 -
@juanpa.arrivillaga 所以 return 返回的是'task'变量的值,而不是'task'变量本身?
-
是的。变量对于函数来说是local,或者可以在全局范围内,或者在某个封闭范围内。你不传递变量,你传递值。变量通常只存在于给定的函数执行。所以返回一些东西的函数通常期望你在调用者中捕获那个值,所以
returned_value = some_func(),如果some_func返回foo并不重要,因为foo不会在你调用some_func的地方定义, 除非你做类似foo = some_func的事情,但它们仍然是两个不同的变量 -
您需要捕获从函数返回的值以对这些值执行某些操作,否则它们将变得无法访问,并且如果不存在其他引用,它们将被垃圾收集。每次调用返回值的函数时,都需要在调用者的变量中捕获该值。就像您使用任何内置函数一样,例如你会
x = input(...)对吗?你为什么不直接做input()? -
@juanpa.arrivillaga 因为这是我的问题的真正答案,你可以把它放在一个答案中,如果你愿意,我会标记它。
标签: python python-3.x variables return try-catch