TL; DR
inputfunzione in Python 2.7, valuta qualunque sia la tua immissione, come espressione di Python. Se vuoi semplicemente leggere le stringhe, usa la raw_inputfunzione in Python 2.7, che non valuterà le stringhe di lettura.
Se stai usando Python 3.x, raw_inputè stato rinominato in input. Citando le note di rilascio di Python 3.0 ,
raw_input()è stato rinominato in input(). Cioè, la nuova input()funzione legge una riga sys.stdine la restituisce con la nuova riga finale rimossa. Aumenta EOFErrorse l'ingresso viene interrotto prematuramente. Per ottenere il vecchio comportamento di input(), utilizzareeval(input())
In Python 2.7 , ci sono due funzioni che possono essere utilizzate per accettare input dell'utente. Uno è inpute l'altro è raw_input. Puoi pensare alla relazione tra loro come segue
input = eval(raw_input)
Considera il seguente pezzo di codice per capirlo meglio
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
inputaccetta una stringa dall'utente e valuta la stringa nel contesto Python corrente. Quando digito dudecome input, trova che dudeè legato al valore thefourtheyee quindi il risultato della valutazione diventa thefourtheyee al quale viene assegnato input_variable.
Se inserisco qualcos'altro che non è presente nell'attuale contesto di Python, fallirà NameError.
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
Considerazioni sulla sicurezza con Python 2.7 input:
Poiché qualsiasi tipo di utente viene valutato, impone anche problemi di sicurezza. Ad esempio, se hai già caricato il osmodulo nel tuo programma con import os, e quindi l'utente digita
os.remove("/etc/hosts")
questo verrà valutato come espressione di chiamata di funzione da Python e verrà eseguito. Se si esegue Python con privilegi elevati, il /etc/hostsfile verrà eliminato. Vedi, quanto potrebbe essere pericoloso?
Per dimostrarlo, proviamo di inputnuovo ad eseguire la funzione.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Ora, quando input("Enter your name: ")viene eseguito, attende l'input dell'utente e l'input dell'utente è un richiamo della funzione Python valido e quindi viene anche invocato. Ecco perché stiamo vedendo di Enter your name again:nuovo pronto.
Quindi, stai meglio con la raw_inputfunzione, in questo modo
input_variable = raw_input("Enter your name: ")
Se è necessario convertire il risultato in un altro tipo, è possibile utilizzare le funzioni appropriate per convertire la stringa restituita da raw_input. Ad esempio, per leggere gli input come numeri interi, utilizzare la intfunzione, come mostrato in questa risposta .
In python 3.x , c'è solo una funzione per ottenere input utente e si chiama input, che è equivalente a Python 2.7 raw_input.
inputdi comportarmi in questo modo, ma solo in 2.7. Cosa dice quando si eseguepython --versionda un prompt dei comandi? In alternativa, cosa succede se scriviimport sys; print(sys.version)all'inizio della tua sceneggiatura?