2017-01-16 3 views
-4

Eigentlich habe ich zwei Fragen zu dem Folge Code-Schnipsel:Existenz einer Variablen in Python 2 vs 3?

Snippet 1:

if a: 
    return 1 
else: 
    return 0 

Snippet 2:

try: 
    a = input() 
except NameError: 
    return 0 
else: 
    return 1 

Diese beiden Teile des Codes verwendet werden, um die Existenz eines überprüfen Variable in Python. Die erste in Python verwendet wurde 3.

Meine Fragen sind:

  1. Warum, wenn nur Geben Sie gegeben als Eingabe gegeben, der erste Schnipsel 0 gibt, was bedeutet, „existiert nicht“, aber im zweiten Codeschnipsel ist das Gegenteil und es weist "" dem Wert zu?

  2. Ich benutze Python 2, also für dieses Problem, was kann ich tun?

+3

Ich kann Ihre Frage nicht einmal weit genug verstehen, um zu versuchen, es zu bearbeiten. Bitte nehmen Sie die [Tour] und überprüfen Sie [fragen] - eine [MCVE], die das Problem neu erstellt, wäre sehr nützlich. – jonrsharpe

+5

Keines dieser Snippets prüft die Existenz einer Variablen ... – ForceBru

+0

Kannst du mir erklären, was das sind ?! –

Antwort

0

Ich glaube, Sie verwechseln die Existenz einer Variablen und deren Wert.

Weder Codeschnipsel direkt überprüft das Vorhandensein der Variablen a. Die ersten Snippets überprüfen ihren Wert. Wenn es nicht existiert, wird eine Ausnahme ausgelöst.

Der eingebaute in input() Funktion im Code-Schnipsel 2 verwendet wird, unterscheidet sich in Python 2 & 3.

In Python 2 implizit eval() auf, was Zeichenfolge durch die eingegeben wurde nennen würde benutzer so es konnte Eine NameError Ausnahme auslösen, wenn eine Referenz auf eine nicht definierte Variable als Eingabe angegeben wurde (z. B. a oder b * 42).

Python 3 tut das nicht. Denn es macht nicht ist Rückkehr, was der Benutzer eingegeben-in als Zeichenfolge (ohne die folgenden Zeilen zum entsprechenden am Ende auf der Tastatur den Benutzer eingeben.

Die folgende Abbildung zeigt, wie für die Existenz einer Variablen überprüfen (und erhalten Sie seinen Wert, wenn es existiert) in Python 2 und 3. Beachten Sie, dass es davon ausgeht, dass die Variable a niemals einen zulässigen Wert von None haben könnte.

def check_existence_of_a(): 
    try: 
     return a 
    except NameError: 
     return None 

if check_existence_of_a() is None: 
    print('variable "a" does not exist') 
else: 
    print('variable "a" exists and its value is {}'.format(a)) 

a = 42 

if check_existence_of_a() is None: 
    print('variable "a" does not exist') 
else: 
    print('variable "a" exists and its value is {}'.format(a)) 

Ausgang:

variable "a" does not exist 
variable "a" exists and its value is 42 

aktualisieren:

Verwendung von Python 2, Ihr zweiter Code-Schnipsel modifiziert werden könnte, wie unten gezeigt SyntaxError s durch die Nutzer verursacht behandeln nichts Eingabe aber Geben Sie ein - was passiert, weil das dann dazu führt, dass es ruft eval(""):

def get_a(): 
    try: 
     a = input('>') 
    except SyntaxError: 
     print('illegal input encountered') # optional 
     return None 
    except NameError: 
     return 0 
    else: 
     return 1 

get_a() 

Alternativ können Sie aus wechseln input()-raw_input() mit, die nicht Anruf tut eval() und stattdessen würde nur zurückkehren, die (möglicherweise leer) string den Benutzer eingegeben.

+0

richtig! Ich habe den Unterschied zwischen Eingabefunktion in Python 2 und 3.so was kann ich tun, um dieses Problem in Python 2 zu behandeln? Ich brauche eine Bedingung, dass, wenn wir die Eingabe eingeben tun etwas und wenn wir Nummer eingeben oder ... etwas tun sonst. : ((( –

+0

Ihr Code-Schnipsel geben Sie mir diesen Fehler, wenn ich die Eingabe als Eingabe eingeben: SyntaxError: Unerwarteter EOF beim Parsen Ich denke, dies aufgrund der Unterschied zwischen Eingabefunktion in Python 2 & 3 –

+0

Das liegt daran, wie ich schon sagte, in Python 2, 'input()' ist äquivalent zu 'eval (raw_input())'. Wenn Sie nur Enter drücken, gibt der 'raw_input()' Teil '' '' zurück, eine leere Zeichenkette, die der 'eval' Teil als a betrachtet 'SyntaxError'. Versuche' eval ("") 'selbst auszuführen und siehe. Ich werde meine Antwort aktualisieren und Ihnen zeigen, wie Sie damit umgehen. – martineau

Verwandte Themen