Globale und lokale Variablen
Lokal und global
Wird im Hauptprogramm eines Python-Programms eine Variable eingeführt und mit einem Wert belegt, so kann auch in jeder selbst definierten Routine auf diesen Wert zugegriffen werden. Deshalb spricht man von einer globalen Variable.
Im gezeigten Programm ist zahl
eine globale Variable.
Wird hingegen eine Variable nur in einer Routine mit einem Wert belegt,
so kann auch nur innerhalb dieser Routine auf diese Variable
zugegriffen werden. Man spricht hier von einer lokalen
Variable (lat. locus: der Ort). Die Variable andere_zahl
ist eine solche lokale
Variable. Wenn man versucht, aus dem Hauptprogramm auf eine lokale
Variable zuzugreifen, erscheint eine Fehlermeldung. Man sagt: Globale
Variablen gelten überall, lokale Variablen
gelten nur in den Routinen, in denen sie zum ersten Mal
verwendet wurden.
Aufgabe 1: Gültigkeitsbereich von Variablen
Zuweisen von Werten auf globale Variablen
Der Zugriff auf globale Variablen innerhalb von Routinen gilt jedoch nicht für das Verändern von Variablenwerten. Denn das könnte ein ziemlich gemeines Problem verursachen, wie das folgende Gedankenexperiment zeigt.
Angenommen, Yasmin hat eine sehr nützliche Routine geschrieben und Franz will diese für
sein eigenes Programm benutzen. Yasmin verwendet in ihrer Routine eine
Variable mit dem Namen zahl
. Innerhalb ihrer Routine wird der Wert
von zahl
geändert. Franz hingegen hat in seinem
Hauptprogramm ebenfalls eine Variable mit dem Namen zahl
.
Wenn Franz nun Yasmins Code in sein Programm kopieren und Yasmins
Funktion aufrufen würde, dann würde Yasmins Routine den Wert von
zahl
im Hauptprogramm von Franz ändern. Das Programm von
Franz würde dann plötzlich nicht mehr richtig laufen und er müsste
mühsam herausfinden, warum das Ausführen von Yasmins Routine sein
Programm aus dem Konzept bringt.
Mit anderen Worten: Wenn Franz eine Routine von Yasmin benutzen wollte,
müsste er jedesmal schauen, ob es keine Dopplung von Variablennamen
gibt. Gerade bei langen Routinen wäre das extrem lästig.
Deshalb hat Python hier eine Sicherheitsmaßnahme eingebaut: Routinen dürfen den Wert globaler Variablen zwar benutzen, aber normalerweise nicht ändern.
Was aber passiert, wenn es eine Routine dennoch versucht? In diesem
Fall wird eine Kopie der Variable angelegt. Das heißt: Es gibt jetzt
zwei Variablen mit dem Namen zahl
, die unterschiedliche
Werte haben können. Innerhalb der Routine wird die neu erstellte Kopie verwendet,
aber auch nur dort. Die Kopie ist eine lokale Variable. Außerhalb
dieser Routine gilt nur die globale Variable.
Das passiert z.B., wenn man im obigen Programm in der Routine
gib_zahl_aus()
der Variablen zahl
einen neuen
Wert zuweist.
Aufgabe 2: Zwei Variablen mit gleichem Namen
Umgehen der Sicherheit
Python sorgt also mit dem Verbot, globale Variablen innerhalb einer Routine zu ändern, für Sicherheit. Das ist gut, manchmal aber auch lästig, wie das folgende Beispiel zeigt.
Carlotta hat ein Programm geschrieben, das ein Rechteck auf den Bildschirm zeichnet.
Vollkommen nachvollziehbar sagt sie: Ich möchte, dass die Eingabe der Zahlen in eine eigene Routine mit dem Nameeingabe
gespeichert wird.
Das Programm funktioniert nicht. Denn das Programm weist den Variablen
innerhalb der Routine eingabe
Werte zu und versucht, auf
diese Werte innerhalb des Hauptprogramms zuzugreifen. Das funktioniert wegen der
oben beschriebenen Sicherheitsmaßnahmen aber nicht.
Carlotta kann das Problem aber umgehen, indem sie dem Programm sagt:
"Ich weiß, dass ich den Sicherheitsmechanismus umgehe, aber ich will
tatsächlich den globalen Variablen mit den Namen
x1
,y1
,x2
und y2
Werte zuweisen und keine lokale Kopie anlegen."
Aufgabe 3: Kompaktere Schreibweise
global
beginnen, auch zusammenfassen. Ersetze sie durch die eine Zeile
global x1,y1,x2,y2
und teste das Programm.
Manche Programmierer würden sagen, dass die oben beschriebene Art, über Routinen den Wert globaler Variablen zu ändern, hässlich oder sogar unsicher sei. Ganz unrecht haben sie nicht, wenn sie für diesen Fall Funktionen vorziehen, die später in diesem Abschnitt beschrieben werden.