ProgrammierungBackend-Entwickler

Was ist der Geltungsbereich (Scope) von Variablen in Python, und wie funktioniert das Schlüsselwort `global`? Geben Sie ein praktisches Beispiel an, wo ein falsches Verständnis des Geltungsbereichs zu Fehlern führt.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Local (lokal) — innerhalb einer Funktion.
  • Enclosing (umgebend) — innerhalb äußerer Funktionen für verschachtelte Funktionen.
  • Global (global) — auf Modulebene.
  • Built-in (eingebaute Namen von Python).

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.

Fangfrage.

"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.

Beispiele aus der Praxis für Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.