2016-06-19 38 views
5

In Python 3, scrivo un semplice comando per accettare un ingresso intero dall'utente così:Perché l'eval di Python (input ("Immetti input:")) cambia il tipo di dati dell'input?

x = int(input("Enter a number: ")) 

Se mi salta la parte int() e semplicemente utilizzare x = input("Enter a number: "), tipo di dati del mio input è una stringa, non un numero intero. Lo capisco.

Tuttavia, se uso il seguente comando:

x = eval(input("Enter a number: ")) 

tipo di dati del input è 'int'.

Perché succede?

+0

forse è un controllo di tipo dinamico quando si utilizza eval()? – cssGEEK

+0

'eval' tratta l'input come se fosse scritto in codice, facendo' x = 3' nel codice rende un intero, quindi 'x = eval (" 3 ")' renderà anche x un intero, lasciando comunque che l'utente inserisca arbitrariamente il codice come loro input può essere un grosso problema, se digitassero 'open (__ file __, 'w'). close()' cancellerebbe il file corrente in esecuzione. –

risposta

5

Perché succede?

x = eval(input("Enter a number: ")) non è la stessa cosa x = eval('input("Enter a number: ")')

I precedenti primi inviti input(...), ottiene una stringa, ad esempio '5' poi lo valuta, è per questo che si ottiene un int, in questo modo:

>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...) 
5 # You get an int 

Mentre il secondo (più in linea con quello che ti aspettavi), valuta l'espressione 'input("Enter a number: ")'

>>> x = eval('input("Enter a number: ")') 
Enter a number: 5 
>>> x 
'5' # Here you get a str 
0

Perché un numero è un'espressione valida in Python e valuta a se stessa (e il suo tipo è int). Ad esempio, se immetti una stringa di rifiuti con un nome non esistente (ad esempio 'abcdefgh'), verrà sollevata un'eccezione NameError (l'eccezione viene sollevata durante la valutazione).