2010-01-19 16 views
13

Estoy completamente perdido en cuanto a por qué esto no está funcionando. Debería funcionar con precisión, ¿verdad?"NameError: name '' no está definido" después de la entrada del usuario en Python

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

me sale esta excepción:

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 

Dice NameError 'k', porque escribí 'k' como la entrada durante mis pruebas. He leído que la declaración impresa solía estar sin paréntesis, pero que ha quedado obsoleta ¿no?

+1

'input' es equivalente a' eval (raw_input (prompt)) '. Solo quieres 'raw_input()'. –

+1

input() está bien con Python 3k. @OP qué versión de Python estás usando? – ghostdog74

+0

@Sergio Esto no está relacionado con su pregunta, pero debe usar la primera letra minúscula para los nombres de las variables (como 'nombre de usuario' en lugar de 'nombre de usuario'). – Roman

Respuesta

13

No utilice input() en 2.x. Use raw_input() en su lugar. Siempre.

+0

¿Cuándo se utilizó Input()? En versiones anteriores? –

+0

Sí. Python versión 2.x. http://docs.python.org/library/2to3.html # 2to3fixer-input –

+2

'input()' siempre se rompió. 3.x "lo arregló", pero el daño tardará mucho tiempo en sanar. –

11

En Python 2.x, input() "evalúa" lo que se escribe. (Ver help(input)). Por lo tanto, cuando ingresa k, input() intenta encontrar el k. Como no está definido, genera la excepción NameError.

Usa raw_input() en Python 2.x. En 3.0x, input() es fijo.

Si que realmente desea utilizar input() (y esto no es muy recomendable), y luego citar la variable de k de la siguiente manera:

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

La respuesta aceptada, proporciona la solución correcta y @ ghostdog74 da la razón para la excepción Pensé que podría ser útil para ver, paso a paso, por qué esto plantea una NameError (y no otra cosa, como ValueError):

Según Python documentación 2.7, input() evaluates lo que escribe, por lo que en esencia el programa se convierte en la siguiente:

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

Supongamos entrada es bob, entonces esto se convierte en: 'Bob'

username = eval('bob') 

Desde eval() ejecuta como si se tratara de una expresión de Python, el programa se convierte en la siguiente:

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

Usted podía hacer que funcione mi entrada "bob" (con las comillas), porque entonces el programa es válido:

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

se puede probar por ir a través de cada paso en el Python REPL usted mismo. Tenga en cuenta que la excepción ya aparece en la primera línea, no dentro de la declaración de impresión.

Cuestiones relacionadas