2016-06-19 15 views
5

In Python 3, I einen einfachen Befehl schreibt also eine ganze Zahl Eingabe vom Benutzer zu akzeptieren:Warum ändert Python eval (Eingabe ("Eingabe eingeben:")) den Datentyp der Eingabe?

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

Wenn ich den int() Teil überspringen und einfach x = input("Enter a number: ") verwende, Datentyp meiner Eingabe der ein String ist, nicht eine ganze Zahl. Ich verstehe das.

Allerdings, wenn ich den folgenden Befehl verwenden:

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

der Datentyp der Eingabe 'int'.

Warum passiert das?

+0

vielleicht ist es eine dynamische Typprüfung, wenn Sie eval() verwenden? – cssGEEK

+0

'eval' behandelt die Eingabe so, wie sie in Code geschrieben wurde, macht 'x = 3' im Code eine Ganzzahl, also wird x = eval (" 3 ")' auch x zu einer Ganzzahl machen, aber den Benutzer willkürlich eingeben lassen Code als ihre Eingabe kann ein riesiges Problem sein, wenn sie 'open (__ Datei __, 'w') eingeben. close()' würde es die aktuelle ausführende Datei löschen. –

Antwort

5

Warum passiert das?

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

der ehemaligen ersten Anrufe input(...), bekommt einen String nicht das Gleiche ist, z.B. '5' wertet es dann, das ist, warum Sie eine int bekommen, auf diese Weise:

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

Während letztere (mehr ausgerichtet sind mit dem, was Sie erwartet hatten), wertet den Ausdruck 'input("Enter a number: ")'

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

Da eine Reihe ist ein gültiger Ausdruck in Python und berechnet sich selbst (und sein Typ ist int). Wenn Sie beispielsweise eine Abfallzeichenfolge mit einem nicht vorhandenen Namen (z. B. "abcdefgh") eingeben, wird eine NameError-Ausnahme ausgelöst (die Ausnahme wird während der Auswertung ausgelöst).