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.

使用一个循环