2009-05-30 5 views
49

Ich habe schreckliche Probleme, die Python-Scoping-Regeln zu verstehen.Warum funktioniert die Zuordnung zu meinen globalen Variablen in Python nicht?

Mit dem folgende Skript:

a = 7 

def printA(): 
    print "Value of a is %d" % (a) 

def setA(value): 
    a = value 
    print "Inside setA, a is now %d" %(a) 


print "Before setA" 
printA() 
setA(42) 
print "After setA" 
printA() 

das Unerwartete Gibt (für mich) Ausgang:

 
    Before setA 
    Value of a is 7 
    Inside setA, a is now 42 
    After setA 
    Value of a is 7 

Wo ich den letzten Druck des Wertes eines erwarten würde 42 sein, nicht 7. Was fehlt mir an Pythons Scope-Regeln für das Scoping von globalen Variablen?

Antwort

97

Globale Variablen sind speziell. Wenn Sie versuchen, innerhalb einer Funktion einer Variablen a = value zuzuweisen, wird innerhalb der Funktion eine neue lokale Variable erstellt, auch wenn eine globale Variable mit demselben Namen vorhanden ist. Um stattdessen die globale Variable zuzugreifen, fügen Sie ein global statement innerhalb der Funktion:

a = 7 
def setA(value): 
    global a # declare a to be a global 
    a = value # this sets the global value of a 

Siehe auch Naming and binding für eine ausführliche Erklärung von Pythons Benennung und verbindlichen Regeln.

+12

* (rohes Wort) * Python definieren, – theonlygusti

11

Der Trick, dies zu verstehen, besteht darin, dass Sie beim Zuweisen zu einer Variablen mit = ebenfalls eine lokale Variable deklarieren. Anstatt also den Wert der globalen Variablen a zu ändern, setzt setA (value) tatsächlich eine lokale Variable (die zufällig als a bezeichnet wird) auf den übergebenen Wert.

Dies wird deutlicher, wenn Sie versuchen, den Wert zu drucken von einem zu Beginn des setA (Wertes) wie folgt:

def setA(value): 
    print "Before assignment, a is %d" % (a) 
    a = value 
    print "Inside setA, a is now %d" % (a) 

Wenn Sie versuchen, diesen Python ausführen werden Sie einen hilfreichen Fehler:

 
Traceback (most recent call last): 
    File "scopeTest.py", line 14, in 
    setA(42) 
    File "scopeTest.py", line 7, in setA 
    print "Before assignment, a is %d" % (a) 
UnboundLocalError: local variable 'a' referenced before assignment 

Dies sagt uns, dass Python hat, dass die entschieden Die Funktion setA (value) hat eine lokale Variable namens a, die Sie ändern, wenn Sie ass Ign in der Funktion. Wenn Sie in der Funktion nicht a zuweisen (wie bei printA()), verwendet Python die globale Variable A.

Um eine Variable als global zu markieren, müssen Sie das globale Schlüsselwort in Python, im Bereich verwenden dass Sie die globale Variable verwenden möchten. In diesem Fall ist das innerhalb der setA (value) -Funktion. Also das Skript wird:

a = 7 

def printA(): 
    print "Value of a is %d" % (a) 

def setA(value): 
    global a 
    a = value 
    print "Inside setA, a is now %d" %(a) 


print "Before setA" 
printA() 
setA(42) 
print "After setA" 
printA() 

Diese eine Zeile hinaus sagt Python, dass, wenn Sie die Variable a in der setA (Wert) Funktion, die Sie über die globale Variable sprechen, nicht eine lokale Variable.

2

Python hat kein Konzept von Variablen wie andere Sprachen. Sie haben Objekte, die "irgendwo" stehen und Referenzen auf diese Objekte haben. = wird verwendet, um diese Objekte Referenzen im aktuellen Namensraum zuzuweisen.

Sie erstellen einen Namen a im Namespace der setA-Funktion, die sich auf das Objekt bezieht, auf das sich der Wert bezieht.

1

innerhalb der Funktion, ein als lokaler Variable behandelt wird, müssen Sie

global a

innerhalb der Funktion