Sichtbarkeitsregeln
In diesem Theorieblock diskutieren wir an welcher Stelle im Code wir auf eine Variable zugreifen können. Naiv könnte man denken, dass man auf eine Variable an jeder Stelle im Code zugreifen können sollte. Sobald man aber längere Programme schreibt, merkt man, dass dies keine gute Idee ist. Es könnte passieren, dass wir versehentlich Werte in Variablen überschreiben oder vielleicht an einer Stelle weit weg von der Definition einer Variable gar nicht mehr richtig abschätzen können, ob die Variable inzwischen modifiziert wurde. Deshalb versuchen wir immer Variablen nahe an der Stelle zu definieren, wo diese auch gebraucht werden. Damit uns diese später nicht mehr in die Quere kommen, limitiert Python für uns die Sichtbarkeit von Variablen im Code.
Insbesondere sind Variablen, welche wir innerhalb einer Prozedur oder Funktion definieren, nur innerhalb dieser Funktion verfügbar.
def proc1():
a = 3
print(a) #ok
print(a) # Fehler - auf a darf nicht zugegriffen werden
Binden von Variablennamen
Nun stellt sich noch die Frage, was denn passiert, wenn wir mehrere Variablen mit demselben Namen haben. So könnte das Argument einer Funktion oder Prozedur denselben Namen haben wie eine ausserhalb dieser Prozedur definierte Variable. Dies ist im folgenden Beispiel illustriert:
a = 5
print(a) # gibt 5 aus
def foo(a):
print(a) # gibt 7 aus, da foo (unten) mit Wert 7 aufgerufen wird
a = 9 # mutiert Wert lokal
foo(7)
print(a) # gibt 5 aus
In der ersten Zeile ist die Variable a
noch nicht bekannt. Durch die Zuweisung
wird diese angelegt und auf den Wert 5 gesetzt. Nun kann unter dem Namen a
darauf zugegriffen werden. Innerhalb der Prozedur foo
hat jetzt a
aber nicht
etwa den Wert 5, sondern den Wert mit dem die Prozedur aufgerufen wurde. Die Argumente einer Prozedur führen also einfach immer eine
neue Variable ein. Obwohl der Parameter in unserem Beispiel auch den Namen a
trägt, hat die Variable a
innerhalb der Prozedur foo`` nichts mit der
in Zeile 1 definierten Variable zu tun. Wenn wir der Variablen
a``` in der Prozedur
also den Wert 9 zuweisen, hat dies keine Auswirkung auf den Rest des Programms. Die
print-Anweisung auf der letzten Zeile wird also den Wert 5 und nicht 9 ausgeben.
Versuchen Sie dies doch am besten gleich selbst nachzuvollziehen, indem Sie mit dem Code experimentieren:
Experimente
- Übergeben Sie die Variable
a
anstelle der7
beim aufrufen vonfoo
. Ändert sich nun der Wert der Variablena
ausserhalb der Funktion? Was wird auf der letzten Programmzeile ausgegeben?
Fragen und Kommentare
Haben Sie Fragen oder Kommentare zu diesem Artikel? Nutzen Sie das Forum und helfen Sie sich und Ihren Mitstudierenden dieses Thema besser zu verstehen.