Der Geltungsbereich (Scope) einer Variable ist der Kontext, in dem sie verfügbar ist. In Python gibt es 4 Hauptgeltungsbereiche, die man sich nach dem Prinzip LEGB merken kann:
Das Schlüsselwort global ermöglicht es, eine auf globaler Ebene deklarierte Variable innerhalb einer Funktion zu ändern.
def foo(): global my_var my_var = 10 # ändert die globale Variable
Ohne global wird die Variable innerhalb der Funktion als lokal betrachtet, selbst wenn ein solches Name in einem äußeren Geltungsbereich existiert.
"Was gibt der folgende Code aus?"
x = 10 def func(): x = 20 func() print(x)
Antwort:
Es wird 10 ausgegeben, da innerhalb der Funktion eine neue lokale Variable x erstellt wird, die globale nicht geändert wird.
Geschichte
Im Befehls-Handler des Bots wollten sie einen globalen Zähler speichern, aber vergaßen global:
counter = 0 def increment(): counter += 1 # UnboundLocalError: lokale Variable 'counter' wurde vor der Zuweisung referenziert
Der Fehler tritt auf, weil der Interpreter annimmt, dass counter eine lokale Variable ist (da in der Funktion eine Zuweisung erfolgt), und nicht global.
Geschichte
In verschachtelten Funktionen wurde vergessen, dass ohne das Schlüsselwort nonlocal eine versteckte Variable einen lokalen Geltungsbereich erstellt:
def outer(): x = 0 def inner(): x += 1 # UnboundLocalError, x wird in inner als lokal betrachtet
Richtig:
def outer(): x = 0 def inner(): nonlocal x x += 1
Geschichte
Sie schrieben eine Einzeiler:
x = 5 y = (lambda: (x := x + 1))() # SyntaxError in Python < 3.8 oder UnboundLocalError später
Sie vergaßen den Unterschied im Geltungsbereich zwischen Ausdruck und Lambda. Nicht alle Konstruktionen unterstützen eine Zuweisung innerhalb von Lambda, abhängig von der Python-Version.