当我使用input()函数时为什么会出现NameError错误?

12

我在执行这段代码时遇到了一个错误:

nameUser = input("What is your name ? ")    
print (nameUser)

错误信息是

Traceback (most recent call last):
  File "C:/Users/DALY/Desktop/premier.py", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'klj' is not defined

发生了什么事?


1
请输入你的名字作为字符串,例如 'Tom'。或者使用 raw_input 代替 input - gtlambert
一些版本的Python使用input()作为键盘输入函数,而其他版本则使用raw_input()。尝试改用raw_input() - John Gordon
是的,谢谢。它可以使用raw_input() ;) - Mohamed Ali Benmansour
2个回答

8
您正在使用Python 2,其中input()函数尝试评估输入的表达式。因为您输入的是一个字符串,Python将其视为名称并尝试对其进行评估。如果没有定义该名称的变量,则会出现NameError异常。
要解决这个问题,在Python 2中,您可以使用raw_input()。这将返回用户输入的字符串,并且不会尝试对其进行评估。
请注意,如果您使用的是Python 3,则input()的行为与在Python 2中raw_input()相同。

为什么函数被设计成这样。函数的目的只是接受输入。评估输入的必要性是什么。 - Krishna Oza
@darth_coder:raw_input() 的目的是接受输入并将其作为字符串返回。而 input() 则不同,它会对输入进行求值。这就是这两个函数的定义方式。由于在 Python 3 中 raw_input() 被重命名为 input(),而 input() 则被完全删除,因此似乎没有必要再使用这个名字容易引起混淆(在我看来)的 input() 函数了。它可能有什么用途呢?如果你想执行用户输入,那么这是一个显而易见的应用场景。 - mhawke
@mhwake 行啦,但我想要理解input函数背后的设计语义。对于评估输入的确切含义我仍感到困惑。 - Krishna Oza
1
@darth_coder:在Python 2中,input()等同于eval(raw_input()),这就是“评估输入”的含义。阅读有关eval()的更多详细信息。正如我所建议的,input()存在的一个原因是为了方便地评估用户输入。如果这不是一个令人满意的解释,那么我认为你的问题归结为“eval()的目的是什么?”因为这最终就是发生的事情。 - mhawke

3
在Python2中,input会被解释,input()等同于eval(raw_input())。当你输入klj时,Python尝试对该名称进行求值,并引发错误,因为该名称未定义。
在Python2中,使用raw_input从用户获取字符串。
演示1:klj未定义:
>>> input()
klj
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'klj' is not defined

演示 2:klj已定义:

>>> klj = 'hi'
>>> input()
klj
'hi'

演示三:使用 raw_input 获取字符串:

>>> raw_input()
klj
'klj'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接