EMZETT.
Login

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

Kapitel 23 von 44 im Kurs Python. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 defined

Lokal 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: 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)

Ausgabe:

2

Tipp

Verwende global sparsam. Besser ist, Werte als Parameter hineinzugeben und per return zurü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 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:

StufeBedeutung
Localin der aktuellen Funktion
Enclosingin umgebenden Funktionen
Globalim Modul (der Datei)
Built-ineingebaute 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 callable

Merke

  • 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

Weiter im Kurs

Zurück: Parameter im Detail

Weiter: Lambda, map, filter und Co.

Alle Kapitel: Python im Überblick