python 名称未定义,即使它是

python name not defined even though it is

我知道这是基本的,但实际上我什至不知道我做错了什么。

while True:
    try:
        end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
    except ValueError:
        print("\nPlease Enter Only 1 Or 2")
    if end==1:
        exit()
    elif end==2:
        continue

我在开始时确实定义了 end,但错误是 NameError: name 'end' is not defined 我什至尝试过将 end 设为全局。

end 仅在没有 ValueError 时分配给。如果 int() 引发异常,则赋值 永远不会发生

要么测试有效的 endinside try(这样你就知道没有引发异常),或者为 end第一。

例如,如果输入了 12 以外的任何内容,则以下不会抛出您的异常,并且仍会提示用户重新输入数字:

while True:
    try:
        end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
        if end==1:
            exit()
        elif end==2:
            break
    except ValueError:
        pass
    print("\nPlease Enter Only 1 Or 2")

请注意,我将 print() 移动到 外部 except 块;如果抛出异常或者没有执行 breakexit() ,它将被打印出来。请注意,我在这里使用 break 而不是 continue 来退出 while True 循环; continue 将开始下一次迭代,提示用户再次输入数字。

它试图为结束分配一个值,但捕获了一个 ValueError 并且在 except 之后它试图查看 'end' 是什么但是由于异常它从未被分配一个值。

如果 int(input(...)) 失败,将引发 ValueError。这发生在 end 被分配之前。在错误处理中添加另一个控制语句,例如

while True:
    try:
        end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
    except ValueError:
        print("\nPlease Enter Only 1 Or 2")
        continue  # ask again
    if end==1:
        exit()
    elif end==2:
        continue

其他人已经说明问题;这是一个规范的解决方案。这符合我们许多人看待这个过程的方式: - 抓住回应 - 直到我得到 合法 回复 - ... 告诉用户出了什么问题 - ... 获得新回复

input_prompt = "If You Don't Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"
response = input(input_prompt)
while response != '1' and response != '2':
    print("\nPlease Enter Only 1 Or 2")
    response = input(input_prompt)
end = int(reponse)

这没有不自然的循环退出(更难跟踪和维护),也没有异常处理(慢)。