Kurz: Der Gültigkeitsbereich (Scope) bestimmt, wo eine Variable sichtbar ist. Das ist wichtig, damit Funktionen sich nicht gegenseitig die Variablen überschreiben.
Teil des Kurses Python
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)Fehlermeldung:
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)Ausgabe:
innen: 100
außen: 0global: 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)Ausgabe:
2Tipp
Verwende
globalsparsam. Besser ist, Werte als Parameter hineinzugeben und perreturnzurückzubekommen. Das macht Funktionen unabhängig und leichter zu testen.
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())Ausgabe:
1 2 3Die 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]))Fehlermeldung:
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
Übungsaufgabe
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.
Quiz zur Selbstkontrolle
Was passiert, wenn du eine lokale Variable außerhalb ihrer Funktion benutzt?
- Es gibt einen NameError (richtig)
- Sie hat den Wert None
- Sie wird automatisch global
- Sie hat den Wert 0
Wofür steht das L in LEGB?
- Local, der Bereich der aktuellen Funktion (richtig)
- Loop, der Bereich einer Schleife
- Library, die Standardbibliothek
- Last, der letzte definierte Name
Wozu dient das Schlüsselwort global?
- Damit eine Funktion eine globale Variable ändern darf (richtig)
- Um eine Variable für alle Programme sichtbar zu machen
- Um eine Variable zu löschen
- Um eine Konstante zu definieren
Weiter im Kurs
Zurück: Parameter im Detail
Weiter: Lambda, map, filter und Co.
Alle Kapitel: Python im Überblick