Python中的递归函数变量范围混淆

时间:2021-04-25 21:31:17

标签: python variables recursion scope local

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 块中来实现此功能,但为什么我必须这样做?

1 个答案:

答案 0 :(得分:3)

<块引用>

我认为变量 number 应该在函数的每次迭代中指向不同的对象。

是什么导致局部变量 number 在当前调用中被设置?答案:number = int(input("What is your favorite number?\n\n"))。它总是被分配吗?回答:不,如果 int 引发异常,则不会。递归调用何时发生?答案:当且仅当引发异常时。因此,当递归调用发生时,number 是否在当前调用中设置了值?答案:

<块引用>

我知道我可以简单地将返回编号移动到 try 块中以实现此功能

没有;这不起作用!如果引发异常,则 return number 在当前调用中不会发生。递归调用将发生,然后从该递归调用返回的值将被忽略。在当前调用中,控制流到达函数的末尾,并返回 None。您必须explicitly return the value from the recursive call,或者将其明确分配给number,然后return

但这很丑陋。您应该为此使用循环like everyone else does