Skip to main content

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 der 7 beim Aufrufen von foo. Ändert sich nun der Wert der Variablen a 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.