10.3 Zugriff auf globale Variablen 

Bisher wurde ein Funktionskörper als abgekapselter Bereich betrachtet, der ausschließlich über Parameter bzw. den Rückgabewert Informationen mit dem Hauptprogramm austauschen kann. Das ist zunächst auch gar keine schlechte Sichtweise, denn so hält man seine Schnittstelle »sauber«.
Zunächst einmal müssen zwei Begriffe unterschieden werden. Wenn wir uns im Kontext einer Funktion, also im Funktionskörper befinden, dann können dort selbstverständlich Referenzen und Instanzen erzeugt und verwendet werden. Diese haben jedoch nur unmittelbar in der Funktion selbst Gültigkeit. Sie existieren im sogenannten lokalen Namensraum. Im Gegensatz dazu existieren Referenzen des Hauptprogramms im globalen Namensraum. Begrifflich wird auch zwischen globalen Referenzen und lokalen Referenzen unterschieden. Dazu folgendes Beispiel:
def f():
a = "lokaler String"
b = "globaler String"
Wie stark zwischen globalem und lokalem Namensraum unterschieden wird, zeigt das folgende Beispiel:
def f(a): print a a = 10 f(100)
In diesem Beispiel existiert sowohl im globalen als auch im lokalen Namensraum eine Referenz namens a. Im globalen Namensraum referenziert sie die ganze Zahl 10 und im lokalen Namensraum der Funktion den übergebenen Parameter, in diesem Fall die ganze Zahl 100. Es ist wichtig zu verstehen, dass diese beiden Referenzen nichts miteinander zu tun haben, da sie in verschiedenen Namensräumen existieren.
Im lokalen Namensraum des Funktionskörpers kann jederzeit lesend auf eine globale Referenz zugegriffen werden, solange keine lokale Referenz gleichen Namens existiert:
def f(): print s s = "globaler String" f()
Sobald versucht wird, schreibend auf eine globale Referenz zuzugreifen, wird stattdessen eine entsprechende lokale Referenz erzeugt:
def f(): s = "lokaler String" print s s = "globaler String" f() print s
Die Ausgabe dieses Beispiels lautet:
lokaler String globaler String
Eine Funktion kann dennoch, mithilfe der global-Anweisung, schreibend auf eine globale Referenz zugreifen. Dazu muss im Funktionskörper das Schlüsselwort global, gefolgt von einer oder mehreren globalen Referenzen, geschrieben werden:
def f(): global s s = "lokaler String" print s s = "globaler String" f() print s
Die Ausgabe des Beispiels lautet:
lokaler String lokaler String
Im Funktionskörper von f wird s explizit als globale Referenz gekennzeichnet und kann fortan als solche verwendet werden.