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()
引发异常,则赋值 永远不会发生 。
要么测试有效的 end
值 inside try
(这样你就知道没有引发异常),或者为 end
第一。
例如,如果输入了 1
或 2
以外的任何内容,则以下不会抛出您的异常,并且仍会提示用户重新输入数字:
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
块;如果抛出异常或者没有执行 break
或 exit()
,它将被打印出来。请注意,我在这里使用 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)
这没有不自然的循环退出(更难跟踪和维护),也没有异常处理(慢)。
我知道这是基本的,但实际上我什至不知道我做错了什么。
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()
引发异常,则赋值 永远不会发生 。
要么测试有效的 end
值 inside try
(这样你就知道没有引发异常),或者为 end
第一。
例如,如果输入了 1
或 2
以外的任何内容,则以下不会抛出您的异常,并且仍会提示用户重新输入数字:
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
块;如果抛出异常或者没有执行 break
或 exit()
,它将被打印出来。请注意,我在这里使用 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)
这没有不自然的循环退出(更难跟踪和维护),也没有异常处理(慢)。