2016-06-10 12 views
5

Ich schrieb unter Python-Code. Und ich fand, dass python2 und python3 völlig unterschiedliches Ergebnis für die Eingabe von 1.1 hat. Warum gibt es einen solchen Unterschied zwischen python2 und python3? Für mich sollte int (1.1) 1 sein, dann ist die Position gültiger Index 1 innerhalb des Bereichs 0,1,2. Kannst du bitte erklären, warum Python3 so ein Ergebnis hat?Unterschied zwischen Python2 und Python3 - int() und Eingabe()

s=[1,2,3] 
while True: 
    value=input() 
    print('value:',value) 
    try: 
    position=int(value) 
    print('position',position) 
    print('result',s[position]) 
    except IndexError as err: 
    print('out of index') 
    except Exception as other: 
    print('sth else broke',other) 


$ python temp.py 
1.1 
('value:', 1.1) 
('position', 1) 
('result', 2) 


$ python3 temp.py 
1.1 
value: 1.1 
sth else broke invalid literal for int() with base 10: '1.1' 
+0

Um es wirklich funktionieren zu lassen, können Sie position = int (float (Wert)) –

+1

Können Sie versuchen, Werttyp zu überprüfen? –

Antwort

4

Die Ausgabe ist intput() wandelt den Wert in eine Zahl für python2 und eine Zeichenfolge für Python 3.

int() eines nicht int Zeichenfolge einen Fehler zurückgibt, während int() eines Schwimmers nicht.

Konvertieren des Eingangswertes mit einem Schwimmer entweder:

value=float(input()) 

oder besser (sicherer) noch

position=int(float(value)) 

EDIT: Und am besten von allen, mit input zu vermeiden, da es ein eval verwendet und ist unsicher. Wie Tadhg vorgeschlagen, ist die beste Lösung:

#At the top: 
try: 
    #in python 2 raw_input exists, so use that 
    input = raw_input 
except NameError: 
    #in python 3 we hit this case and input is already raw_input 
    pass 

... 
    try: 
     #then inside your try block, convert the string input to an number(float) before going to an int 
     position = int(float(value)) 

Aus dem Python Docs:

PEP 3111: raw_input() was renamed to input() . That is, the new input() function reads a line from sys.stdin and returns it with the trailing newline stripped. It raises EOFError if the input is terminated prematurely. To get the old behavior of input() , use eval(input()) .

+3

noch sicherer wäre es zu versuchen: input = raw_input; außer NameError: pass 'und behandle dann die Eingabe als eine Zeichenfolge in beiden Szenarien. –

1

Bitte die Release Notes Python 3 überprüfen. Insbesondere wurde die input() Funktion (die als gefährlich angesehen wird) entfernt. Stattdessen wurde die sicherere raw_input()-Funktion in input() umbenannt.

Um Code für beide Versionen zu schreiben, verlassen Sie sich nur auf raw_input(). Fügen Sie Folgendes an den Anfang Ihrer Datei:

try: 
    # replace unsafe input() function 
    input = raw_input 
except NameError: 
    # raw_input doesn't exist, the code is probably 
    # running on Python 3 where input() is safe 
    pass 

BTW: Ihr Beispielcode ist nicht minimal. Wenn Sie den Code weiter reduziert hätten, hätten Sie festgestellt, dass in einem Fall int() über eine float und in der anderen über eine str arbeitet, die Sie dann zu den verschiedenen Dingen gebracht hätte, die input() zurückgibt. Ein Blick auf die Dokumente hätte Ihnen dann den letzten Hinweis gegeben.

Verwandte Themen