为什么我的代码会进入无限循环?

问题描述 投票:0回答:1

我现在有以下代码:

while executed == False:
    try:
        inp = input("Enter the variable you want to change (e.g.: limit = 10): ")
        eval(inp, globals())
    except:
        print("Invalid input")
        continue
    print("Variable has been changed")
    executed = True

而且我不太明白为什么如果我将

exit()
作为输入,它会进入无限循环,一遍又一遍地输出以下行:
Enter the variable you want to change (e.g.: limit = 10): Invalid input
无需我进一步输入任何内容。

我完全不明白为什么它会进入无限循环,因为我希望它要么完全退出,要么只是打印“无效输入”,然后要求我再次输入不同的内容。 为什么总是跳过input()部分直接跳到eval部分? (或者至少我认为这就是它正在做的)。

python eval infinite-loop
1个回答
0
投票

要调试问题,请将代码更改为以下内容:

from time import sleep

executed = False

while executed is False:
    try:
        inp = input("Enter the variable you want to change (e.g.: limit = 10): ")
        eval(inp, globals())
    except BaseException as e:
        print("error is:", e, type(e))
        print("Invalid input")
        sleep(2)
        continue
    print("Variable has been changed")
    executed = True

现在发生的是:

  1. 当输入
    exit()
    时,
    eval
    可以正确执行命令
    exit()
  2. 它抛出一个
    SystemExit
    异常。
  3. 但是,您会在裸露的
    except
    子句中发现它,这意味着您不会让脚本完成。
  4. 但它似乎关闭了“标准输入”文件描述符。
  5. 在下一次迭代中,当它命中时,
    input()
    ,它无法从关闭的文件(stdin)中读取。
  6. 从现在开始,你将永远遇到 ValueError。
© www.soinside.com 2019 - 2024. All rights reserved.