2017-06-05 1 views
1

Code zuerst:Namensraum Verständnis in Python mit, wenn und sonst

# case01 
def x(): 
    if False: 
     #x2 = 22 
     print x1 
    else: 
     print x2 

if __name__ == '__main__': 
    if False: 
     x1 = 1 
    else: 
     x2 = 2 
    x() 

case01 ‚s Ausgang:

2 

Kein Problem! aber wenn ich Kommentar- #x2 = 22 in if False: Block und erneut ausführen, wird es eine Fehlermeldung anzeigt:

--------------------------------------------------------------------------- 
UnboundLocalError       Traceback (most recent call last) 
<ipython-input-4-e36cb32b2c83> in <module>() 
    11  else: 
    12   x2 = 2 
---> 13  x() 

<ipython-input-4-e36cb32b2c83> in x() 
     4   print x1 
     5  else: 
----> 6   print x2 
     7 
     8 if __name__ == '__main__': 

UnboundLocalError: local variable 'x2' referenced before assignment 

Wie ich sehe, wird if False: Block nicht excute, aber warum x2 = 22 eine gewisse Wirkung auf das Skript nehmen i worte?

Meine Python-Version: 2.7.13

+1

Da Zuweisung verwendet wird, um den Gültigkeitsbereich einer Variablen zu bestimmen. Du hast 'x2' zu einem lokalen gemacht. –

Antwort

2

Bevor Ihre Skript Python-Interpreter precompile es in einem Bytecode starten und wenn es ausdrückt "x2 = 22" in der Funktion sieht es x2 in __locals__ für diese Funktion und jeden ref betrachten zu x2 wie zu lokalem x2 nicht zum globalen. Aber wenn Sie Ihre Funktion starten, weisen Sie dem lokalen x2 keinen Wert zu, aber Python sucht immer noch nur nach dem lokalen, so dass Sie den Fehler erhalten.

Ich hoffe, dass ich in verständlicher Weise erklärt, sorry für meine unperfect Englisch)))

+0

danke! Ich habe dich verstanden! – CodeUnsolved

0

x2 definiert ist, nicht in den Anwendungsbereich der Funktion x. Versuchen Sie, "x2 = 22" aus der if-Anweisung zu entfernen, und es wird gut funktionieren. Nur zur Erinnerung, "wenn falsch" zu tun ist völlig nutzlos und macht den Computer eine zusätzliche Berechnung. In diesem kleinen Code macht es keinen Unterschied, aber in einem größeren Code wird es einen bemerkenswerten Unterschied in der Effizienz geben.