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