"NameError: name '' не определен" после ввода пользователем в Python

Я полностью потерял, почему это не работает. Должен ли работать точно, правильно?

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' в качестве ввода во время моих тестов. Я читал, что выражение print не было в круглых скобках, но оно было отменено правильно?

Ответы

Ответ 1

Не используйте input() в 2.x. Вместо этого используйте raw_input(). Всегда.

Ответ 2

В Python 2.x, input() "оценивает" то, что набирается. (см. help(input)). Поэтому, когда вы вводите k, input() пытается найти, что k. Поскольку он не определен, он вызывает исключение NameError.

Используйте raw_input() в Python 2.x. В 3.0x исправлен input().

Если вы действительно хотите использовать input() (и это действительно нецелесообразно), тогда укажите свою переменную k следующим образом:

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

Ответ 3

Принятый ответ дает правильное решение, а @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 самостоятельно. Обратите внимание, что исключение создается в первой строке уже, а не в заявлении печати. ​​