我知道try/except块没有单独的作用域,我也知道这个问题的实际解决方案,尽管我想知道为什么会发生这种情况。我正在为我的sdev类制作一个简单的猜谜游戏,虽然我可以在try/except块之前添加guess_num使其工作,但为什么我也有
我让它循环回main,但是如果我通过程序,没有输入一个数字作为输入,它最终会使我再次回到输入,但是如果我再输入一个数字,它会给我这个错误:
Traceback (most recent call last):
File "C:\Users\Jexxy\Documents\MyRepo\Guessing_Game.py", line 35, in <module>
main()
File "C:\Users\Jexxy\Documents\MyRepo\Guessing_Game.py", line 31, in main
if guess_num > 0 and guess_num < 100 and isinstance(guess_num, int):
UnboundLocalError: local variable 'guess_num' referenced before assignment
def main():
random_num = random.randrange(1, 5)
try:
guess_num = int(input('''Welcome to the guessing game!
A Random number between 1-100 has already been generated!
When ready, please enter a number between 1-100 to make your guess: '''))
except ValueError:
try_again = input("You must enter a number! Try again? Y/N: ")
if try_again.lower() == "y":
main()
else:
exit(0)
if guess_num > 0 and guess_num < 100 and isinstance(guess_num, int):
print(guess_num)
除了函数或类之外,没有特定的作用域可供尝试。但是,当您完成尝试时,您不会转到“除非”,而是转到“除非”中不包含的下一个代码。这就是为什么会出现错误的原因,因为如果不转到,除非内存中没有分配名为try_的变量
当您
loop back to main
因为故意输入无效输入而退出时,最终main()
退出,并且在调用后立即返回。此时,函数将下降到if guess_num ...
行,并且guess_num
未定义首先,您不应该对解决方案使用递归,但为了避免错误,请在
main()
之后添加一个return
仅当
input()
或int()
成功时才设置guess_num
。如果其中任何一个抛出异常,Python就没有要分配给guess_num
的值然而,您真正的错误是使用递归。处理异常时,再次调用
main()
。最后,main()
返回,代码从调用main()
的地方继续。对main()
的每个递归调用都有自己的局部变量集,因此main()
返回时,所有成功运行的main()
都会带着它们的局部变量一起消失。即使在其中一个递归调用中设置了guess_num
,它也无法生存在父函数运行中所以真正发生的是:
main()
,这次成功地运行了代码李>main()
返回,现在您尝试访问局部变量guess_num
,但从未设置过李>不要使用递归。使用循环。或者,如果必须使用递归,请使用
return main()
,这样一旦对main()
的递归调用结束,函数就会退出相关问题 更多 >
编程相关推荐