Der Gültigkeitsbereich (Scope) bestimmt, wo eine Variable sichtbar ist. Das ist wichtig, damit Funktionen sich nicht gegenseitig die Variablen überschreiben.
Lokale und globale Variablen
Eine Variable, die in einer Funktion angelegt wird, ist lokal: Sie existiert nur dort. Variablen außerhalb aller Funktionen sind global und können von Funktionen gelesen werden.
titel = "Mathe" # global
def zeige():
punkte = 42 # lokal
print(titel, punkte)
zeige()
print(titel)
print(punkte)Mathe 42
Mathe
Traceback (most recent call last):
File "beispiel.py", line 9, in <module>
print(punkte)
NameError: name 'punkte' is not definedLokal schlägt global
Weist du in einer Funktion einer Variable einen Wert zu, entsteht eine neue lokale Variable, auch wenn es global schon eine mit dem Namen gibt:
zaehler = 0
def erhoehe():
zaehler = 100 # neue lokale Variable!
print("innen:", zaehler)
erhoehe()
print("außen:", zaehler)innen: 100 außen: 0
global: globale Variable ändern
Soll die Funktion die globale Variable ändern, deklarierst du das mit global:
zaehler = 0
def erhoehe():
global zaehler
zaehler += 1
erhoehe()
erhoehe()
print(zaehler)2
Verschachtelte Funktionen und nonlocal
Funktionen können in Funktionen stehen. Die innere sieht die Variablen der äußeren. Mit nonlocal darf sie sie auch ändern:
def zaehler_erzeugen():
stand = 0
def hochzaehlen():
nonlocal stand
stand += 1
return stand
return hochzaehlen
z = zaehler_erzeugen()
print(z(), z(), z())1 2 3
Die innere Funktion "erinnert sich" an stand, auch nachdem zaehler_erzeugen längst beendet ist. Das nennt man eine Closure.
Die LEGB-Regel
Python sucht einen Namen in dieser Reihenfolge:
| Stufe | Bedeutung |
|---|---|
| Local | in der aktuellen Funktion |
| Enclosing | in umgebenden Funktionen |
| Global | im Modul (der Datei) |
| Built-in | eingebaute Namen wie print, len |
Deshalb sollte man eigene Variablen nicht list, sum oder max nennen: Sie überdecken die eingebauten Funktionen.
sum = 10 # überdeckt die eingebaute Funktion!
print(sum([1, 2, 3]))Traceback (most recent call last):
File "beispiel.py", line 2, in <module>
print(sum([1, 2, 3]))
TypeError: 'int' object is not callableMerke
- In Funktionen angelegte Variablen sind lokal und verschwinden nach dem Aufruf
- Globale Variablen sind lesbar; zum Ändern braucht man
global nonlocaländert Variablen einer umgebenden Funktion- Suchreihenfolge: Local, Enclosing, Global, Built-in (LEGB)
- Namen eingebauter Funktionen nicht als Variablennamen verwenden
Aufgabe
Schreibe eine Funktion zaehler(), die bei jedem Aufruf eine um eins höhere Zahl liefert, einmal mit global und einmal mit einer Closure und nonlocal.