try/except块的范围

2024-09-27 00:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道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)

Tags: andnumberifmain数字usersnumdocuments
3条回答

除了函数或类之外,没有特定的作用域可供尝试。但是,当您完成尝试时,您不会转到“除非”,而是转到“除非”中不包含的下一个代码。这就是为什么会出现错误的原因,因为如果不转到,除非内存中没有分配名为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,它也无法生存在父函数运行中

所以真正发生的是:

  1. 输入非整数值,将引发异常
  2. 您调用了main(),这次成功地运行了代码
  3. main()返回,现在您尝试访问局部变量guess_num,但从未设置过

不要使用递归。使用循环。或者,如果必须使用递归,请使用return main(),这样一旦对main()的递归调用结束,函数就会退出

相关问题 更多 >

    热门问题