Python 中的递归函数变量范围混淆
Recursive function variable scope confusion in Python
def my_function():
try:
number = int(input("What is your favorite number?\n\n"))
except ValueError: #if anything but an integer was given as the str to input
my_function() #recursive to ask again
return number
my_function()
如果我至少遍历递归范围一次然后提供有效输入,这将引发异常 UnboundLocalError: local variable 'number' referenced before assignment
。我认为变量 number 应该在函数的每次迭代中指向一个不同的对象。我在这里错过了什么?
我知道我可以简单地将 return number
移动到 try
块中来实现此功能,但为什么我必须这样做?
I thought the variable number should point to a different object every iteration of the function.
是什么导致在当前调用中设置局部变量 number
?答案:number = int(input("What is your favorite number?\n\n"))
。它总是被分配吗?回答:不,如果 int
引发异常则不会。递归调用什么时候发生?回答:当且仅当引发异常时。因此,当发生递归调用时, number
是否在当前调用中设置了值?答:否.
I recognize I can simply move return number into the try block to achieve this functionality
没有;这 不起作用 !如果引发异常,则 return number
不会在当前调用中发生。将发生递归调用,然后从该递归调用返回的值将被忽略。在当前调用中,控制流到达函数末尾,并返回 None
。您必须 explicitly return
the value from the recursive call,或明确将其分配给 number
,然后再 return
。
但这很丑陋。您应该为此、like everyone else does.
使用一个循环
def my_function():
try:
number = int(input("What is your favorite number?\n\n"))
except ValueError: #if anything but an integer was given as the str to input
my_function() #recursive to ask again
return number
my_function()
如果我至少遍历递归范围一次然后提供有效输入,这将引发异常 UnboundLocalError: local variable 'number' referenced before assignment
。我认为变量 number 应该在函数的每次迭代中指向一个不同的对象。我在这里错过了什么?
我知道我可以简单地将 return number
移动到 try
块中来实现此功能,但为什么我必须这样做?
I thought the variable number should point to a different object every iteration of the function.
是什么导致在当前调用中设置局部变量 number
?答案:number = int(input("What is your favorite number?\n\n"))
。它总是被分配吗?回答:不,如果 int
引发异常则不会。递归调用什么时候发生?回答:当且仅当引发异常时。因此,当发生递归调用时, number
是否在当前调用中设置了值?答:否.
I recognize I can simply move return number into the try block to achieve this functionality
没有;这 不起作用 !如果引发异常,则 return number
不会在当前调用中发生。将发生递归调用,然后从该递归调用返回的值将被忽略。在当前调用中,控制流到达函数末尾,并返回 None
。您必须 explicitly return
the value from the recursive call,或明确将其分配给 number
,然后再 return
。
但这很丑陋。您应该为此、like everyone else does.
使用一个循环