Wenn ich Ihre Situation richtig verstehe, ist das, was Sie sehen, das Ergebnis davon, wie Python lokale (Funktion) und globale (Modul) Namensräume behandelt.
Nehmen wir an, Sie haben ein Modul wie dieses:
# sample.py
myGlobal = 5
def func1():
myGlobal = 42
def func2():
print myGlobal
func1()
func2()
Man könnte erwarten, dass dies 42 ausgibt, aber stattdessen wird 5 ausgegeben. Wie bereits erwähnt, können Sie durch Hinzufügen eines ' global
' Erklärung an func1()
dann func2()
wird 42 gedruckt.
def func1():
global myGlobal
myGlobal = 42
Was hier vor sich geht, ist, dass Python annimmt, dass jeder Name, der zugewiesen innerhalb einer Funktion ist lokal für diese Funktion, es sei denn, es wird ausdrücklich etwas anderes gesagt. Wenn es nur Lesen von einem Namen ableitet und der Name lokal nicht existiert, wird versucht, den Namen in allen enthaltenen Bereichen (z.B. im globalen Bereich des Moduls) zu suchen.
Wenn Sie dem Namen 42 zuordnen myGlobal
Daher erstellt Python eine lokale Variable, die die globale Variable gleichen Namens überschattet. Diese lokale Variable verlässt den Geltungsbereich und ist Müllsammeln cuando func1()
zurück; inzwischen, func2()
kann nie etwas anderes sehen als den (unveränderten) globalen Namen. Beachten Sie, dass diese Namespace-Entscheidung zur Kompilierzeit geschieht, nicht zur Laufzeit -- wenn Sie den Wert von myGlobal
innerhalb func1()
bevor Sie es zuweisen, erhalten Sie eine UnboundLocalError
weil Python bereits entschieden hat, dass es sich um eine lokale Variable handeln muss, der aber noch kein Wert zugewiesen wurde. Aber durch die Verwendung des ' global
Anweisung teilen Sie Python mit, dass es den Namen woanders suchen soll, anstatt ihn lokal zuzuweisen.
(Ich glaube, dass dieses Verhalten größtenteils durch eine Optimierung lokaler Namensräume entstanden ist -- ohne dieses Verhalten müsste Pythons VM jedes Mal, wenn ein neuer Name innerhalb einer Funktion zugewiesen wird, mindestens drei Namenssuchen durchführen (um sicherzustellen, dass der Name nicht bereits auf Modul-/Builtin-Ebene existiert), was eine sehr häufige Operation erheblich verlangsamen würde).
0 Stimmen
Unabhängig davon, wo Sie "global" vor dem Variablennamen erwähnt haben, kann sie überall wie eine normale lokale Variable verwendet werden, sobald Python sie als mit dem Schlüsselwort "global" gelesen hat. Aber es ist eine sehr schlechte Idee, es sei denn, die Variable ist für das gesamte Projekt gemeinsam. Zum Beispiel: project_name, database_url