Was ist der Unterschied zwischen "raw_input ()" und "input ()" in Python 3?


362

Was ist der Unterschied zwischen raw_input()und input()in Python 3?


3
Wie macht man ein Programm, das Eingaben sowohl für Python 2 als auch für Python 3 kompatibel macht?
Solomon Ucko

2
Dazu müssen Sie auf Satz versuchen inputzu raw_inputund Namen Fehler ignorieren.
Solomon Ucko

3
Suchen Sie in der 'six'-Bibliothek nach Python 2- und 3-Kompatibilität.
Jack Homan

Antworten:


418

Der Unterschied besteht darin, dass raw_input()dies in Python 3.x nicht vorhanden input()ist. Eigentlich wurde das Alte raw_input()in umbenannt input()und das Alte input()ist weg, kann aber einfach mit simuliert werden eval(input()). (Denken eval()Sie daran, dass dies böse ist. Versuchen Sie, Ihre Eingaben nach Möglichkeit sicherer zu analysieren.)


93
"Was ist der Unterschied zwischen raw_input...?" - "Der Unterschied ist, dass es keine gibt raw_input." ... Ein drastischer Unterschied, würde ich sagen!
ivan_pozdeev

9
In Python 2 haben sie vermutlich angenommen, dass Programmierer die Benutzereingabe tatsächlich als Befehl "ausführen" wollten, da das anfängliche (ich denke) Anfordern einer Benutzereingabe möglicherweise nur dafür vorgesehen ist. Als sie jedoch feststellten, dass Programmierer möglicherweise auch die "rohe" Eingabe erhalten möchten, entwarfen sie eine andere Funktion namens "raw_input". In Python 3 bemerkten sie, was dumm das war, und löschten einfach die Ausführung des ursprünglichen Eingabestandards, was nur eine einfache Funktion ergab.
JC Rocamonde

1
Repl.it, das Py3.5.1 ausführt, hat raw_input () als Schlüsselwort.
OldBunny2800

2
Es muss gesagt werden, dass eval(und exec) generell vermieden werden sollten, da sie ein Sicherheitsrisiko darstellen können. Für Details siehe Eval ist wirklich gefährlich von SO-Veteran Ned Batchelder. Und dieser Rat gilt natürlich auch für das alte Python 2 input.
PM 2Ring

1
@ PM2Ring Ich habe der Antwort eine Warnung hinzugefügt. Natürlich gibt es gültige Anwendungsfälle für beide eval()und exec(), aber Sie müssen zuerst verstehen, warum Sie sie nicht verwenden sollten, eval()bevor Sie sich für die Verwendung entscheiden.
Sven Marnach

192

In Python 2 , raw_input()gibt eine Zeichenfolge, und input()versucht , den Eingang als Python Ausdruck auszuführen.

Da das Erhalten eines Strings fast immer das war, was Sie wollten, macht Python 3 das mit input(). Wie Sven sagt, wenn Sie jemals das alte Verhalten wollen, eval(input())funktioniert.


7
Sie sollten hinzufügen, dass Python 3 nicht hat raw_input().
Martin Thoma

Was nützt es, Eingaben als Python-Ausdruck auszuführen?
Akshay Vijay Jain

1
@AkshayVijayJain, wahrscheinlich war es für die Eingabe von Zahlen gedacht. Aber es ist total unsicher.
MarSoft

112

Python 2:

  • raw_input() Nimmt genau das, was der Benutzer eingegeben hat, und gibt es als Zeichenfolge zurück.

  • input()nimmt zuerst das raw_input()und führt dann auch ein eval()drauf durch.

Der Hauptunterschied besteht darin, input()dass eine syntaktisch korrekte Python-Anweisung erwartet wird, wo raw_input()dies nicht der Fall ist.

Python 3:

  • raw_input()wurde umbenannt in gibt input()jetzt input()die genaue Zeichenfolge zurück.
  • Alt input()wurde entfernt.

Wenn Sie die alte verwenden möchten input(), dh eine Benutzereingabe als Python-Anweisung auswerten müssen, müssen Sie dies manuell mithilfe von tun eval(input()).


26

In Python 3 raw_input()existiert nicht, was bereits von Sven erwähnt wurde.

In Python 2 input()wertet die Funktion Ihre Eingabe aus.

Beispiel:

name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

Im obigen Beispiel versucht Python 2.x, Harsha als Variable und nicht als Zeichenfolge auszuwerten. Um dies zu vermeiden, können wir um unsere Eingabe doppelte Anführungszeichen wie "harsha" verwenden:

>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

raw_input ()

Die Funktion raw_input () `wertet nicht aus, sondern liest nur, was Sie eingeben.

Beispiel:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

Beispiel:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

Im obigen Beispiel habe ich nur versucht, die Benutzereingaben mit der evalFunktion auszuwerten .


7

Ich möchte der Erklärung, die jeder für die Python 2-Benutzer gibt, etwas mehr Details hinzufügen . raw_input()Inzwischen wissen Sie, dass alle vom Benutzer eingegebenen Daten als Zeichenfolge ausgewertet werden. Dies bedeutet, dass Python nicht einmal versucht, die eingegebenen Daten erneut zu verstehen. Es wird lediglich berücksichtigt, dass die eingegebenen Daten Zeichenfolgen sind, unabhängig davon, ob es sich um eine tatsächliche Zeichenfolge oder int oder etwas anderes handelt.

Während input()andererseits versucht, die vom Benutzer eingegebenen Daten zu verstehen. Die Eingabe wie helloworldwürde den Fehler sogar als ' helloworld is undefined' anzeigen.

Um in Python 2 auch eine Zeichenfolge einzugeben, müssen Sie diese wie ' helloworld' eingeben. Dies ist die in Python übliche Struktur zur Verwendung von Zeichenfolgen.


3

Wenn Sie sicherstellen möchten, dass Ihr Code mit Python2 und Python3 ausgeführt wird, verwenden Sie die Funktion input () in Ihrem Skript und fügen Sie diese hinzu, um mit dem Skript zu beginnen:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.