2016-06-07 10 views
0

Wenn Sie angeben, dass eine Variable global ist, wird sie nicht für Sie erstellt (sofern sie nicht bereits existiert). Was macht die globale Anweisung eigentlich mit der Variablen? Es modifiziert es offensichtlich nicht nur, da es nicht existieren muss, um es zu modifizieren. Sobald dies den Gültigkeitsbereich verlässt, kannWo leben deklarierte, aber nicht definierte globale Variablen in Python?

def foo(): 
    global cat, dog 
    dog = 1 

foo() 
print('dog' in globals()) # => True 
print(dog) # => 1 
print('cat' in globals()) # => False 
print(cat) # => NameError 

Dies wirft auch einen Fehler (nicht überraschend):

def foo(): 
    global cat, dog 
    dog = 1 

def bar(): 
    cat = 2 

foo() 
bar() 
print(dog) 
print(cat) # => NameError 

So offensichtlich die globale Modifikator nur im Rahmen der Funktion arbeitet ausgeführt wird. Wird dies in irgendeiner Weise durch den Müllsammler verursacht? Gibt es ein Phantom-Globalisierungsobjekt, das auf die Erstellung eines Objekts mit dem angegebenen Namen wartet und am Ende der Funktion geklärt wird?

+0

Richtig, aber vor dem Zuweisen von Hund zu einem Wert, gab es keine Fälle von Hund. – Goodies

+0

Mein Punkt ist, dass es offensichtlich nicht direkt den Hund verändert, weil der Hund vor der globalen Aussage nicht existiert. Sie können etwas nicht modifizieren, das nicht existiert. – Goodies

+0

Der Müllsammler hat nichts damit zu tun. 'global' erzeugt die Variable nicht. Wenn Sie "" cat "in globals()' innerhalb des 'foo()' überprüfen, antwortet es mit false. – gdlmx

Antwort

2

Was macht die globale Aussage eigentlich mit der Variablen?

Absolut nichts.

global foo bedeutet, dass alle Vorkommen des Variablennamens foo in den Rahmen der Funktion zu einem Modul-global foo Variable anstelle einer Funktion anruf lokale Variable verweisen. Es macht nichts mit der Variablen selbst.

Wo solche Variablen leben, "leben" sie nirgendwo wirklich. Wenn eine solche Variable zugewiesen wird, wird ein Eintrag für sie in der globalen Variable dict des Moduls erstellt. Wenn die Variable del ist, wird der Eintrag der globalen Variable dict gelöscht. Dies ist identisch mit dem, was passieren würde, wenn Sie diese Variablen auf Modulebene ohne eine global Deklaration zuweisen und del.

1

Die globale ist eine Anweisung an den Parser.

wie in der doc geschrieben. Das bedeutet, dass es nichts ändert. Beachten Sie auch, dass "dies nur für Code gilt, der gleichzeitig mit der globalen Anweisung analysiert wird". Dies kann in dem unten stehenden Beispiel

a=3 
def foo(): 
    exec('global a') 
    a=4 

foo() 
print(a) # 3 

getestet werden, wenn global ist ein Modifikator wie Sie gesagt haben, dann ist die letzte Zeile wird 4. drucken Aber das ist nicht der Fall.