用户输入后在Python中出现"NameError: name '' is not defined

16 投票
3 回答
15051 浏览
提问于 2025-04-15 18:11

我完全搞不懂为什么这个不管用。应该可以正常工作的,对吧?

UserName = input("Please enter your name: ")
print ("Hello Mr. " + UserName)
raw_input("<Press Enter to quit.>")

我遇到了这个错误:

Traceback (most recent call last):  
  File "Test1.py", line 1, in <module>
    UserName = input("Please enter your name: ")
  File "<string>", line 1, in <module>
NameError: name 'k' is not defined  

它显示 NameError 'k',因为我在测试时输入了 'k'。我听说过以前的打印语句是不需要括号的,但现在这个写法已经不推荐用了,对吧?

3 个回答

0

这个被接受的答案给出了正确的解决方案,而@ghostdog74解释了为什么会出现这个异常。我觉得逐步分析一下为什么会引发一个NameError(而不是其他的,比如ValueError)可能会很有帮助:

根据Python 2.7的文档,input()会对你输入的内容进行评估,所以实际上你的程序变成了这样:

username = input('...')
# => translates to
username = eval(raw_input('...')) 

假设输入是bob,那么这就变成了:

username = eval('bob') 

因为eval()会把'bob'当作Python表达式来执行,所以你的程序变成了:

username = bob 
=> NameError
print ("Hello Mr. " + username)

你可以通过输入"bob"(带引号)来让它正常工作,因为那样程序就是有效的:

username = "bob" 
print ("Hello Mr. " + username)
=> Hello Mr. bob

你可以通过自己在Python REPL中逐步尝试来验证这一点。注意,异常在第一行就已经引发了,而不是在打印语句中。

12

在Python 2.x中,input()会“评估”你输入的内容。(可以查看help(input)了解更多)所以,当你输入k时,input()会试图找出k是什么。因为k没有被定义,所以会出现NameError错误。

在Python 2.x中,应该使用raw_input()。在3.0版本中,input()的问题已经修复。

如果你真的想使用input()(但这并不推荐),那么你需要像下面这样把k用引号括起来:

>>> UserName = input("Please enter your name: ")
Please enter your name: "k"
>>> print UserName
k
15

在Python 2.x版本中,不要使用 input()。请始终使用 raw_input()

撰写回答