Seite 1 von 1

Konflikt mit globalen Variablen

Verfasst: Freitag 11. Januar 2008, 18:10
von calo
Hi,

ich scheine das mit den lokalen und globalen Variablen nicht ganz zu verstehen. Mal kennt meine Funktion die globale Variable nicht...

Code: Alles auswählen

myGlobal = None

def foo():
	print myGlobal
	myGlobal = None

myGlobal = "egg"
foo()
und dann wieder wird sie richtig erkannt...

Code: Alles auswählen

myGlobal = None

def foo():
	print myGlobal
	#myGlobal = None

myGlobal = "egg"
foo()
Kann mir das jemand erklären? Offensichtlich scheint die "Globalität" einer Variable davon abzuhängen, ob man sie verändert.

Vielen Dank, Calo

Re: Konflikt mit globalen Variablen

Verfasst: Freitag 11. Januar 2008, 18:34
von Leonidas
calo hat geschrieben:Kann mir das jemand erklären? Offensichtlich scheint die "Globalität" einer Variable davon abzuhängen, ob man sie verändert.
Nein, tut sie nicht. Im zweiten Beispiel wird eine Variable ausgegeben. Dazu schaut Python ob es sie im Scope gibt - gibt es nicht. Also wird die Modulglobale Variable hergenommen.

Im ersten Beispiel gibt es eine lokale Variable (sie heißt ``myGlobal``, ist aber dennoch eine lokale Variable), aber die ist noch nicht definiert. Das ist alles.

Es gibt die Möglichkeit, dass man definiert, dass bestimmte lokale Variablen globale überschreiben, aber das solltest du nicht machen.

Verfasst: Freitag 11. Januar 2008, 19:18
von Erwin
Um Globale-Variablen im Funktionskopf (also im Lokalem-Bereich) zu ändern, muss man es unter Python innerhalb des Funktionsbereichs Global machen.
Das geht mit dem Befehl global:

Code: Alles auswählen

myGlobal = None

def foo():
    global myGlobal
    print myGlobal
    myGlobal = None

myGlobal = "egg"
foo()
Allerdings wird dann natürlich der Inhalt von myGlobal auch außerhalb der Funktion überschrieben. Weil er ja durch den Befehl global auf den Globalen Namen zugreift, anstatt auf einen Lokalen.

Besser wäre es vermutlich den Befehl return zu verwenden, welches das Ergebnis oder auch gezielte Zeichen einer Funktion zurück gibt.

Code: Alles auswählen

myGlobal = None

def foo():
    print myGlobal
    return None

myGlobal = "egg"
myGlobal = foo()
Bei None passiert dann allerdings gar nichts.
Wenn Du aber den Inhalt mir einem weiteren print-Befehl ausgeben lässt, sollte dann 'None' ausgegeben werden.

edit:
Korrektur:
Es hat nichts mit None zu tun, sondern da es nur eine Zuweisung ist, muss man natürlich noch mal die Variable ausgeben lassen (also print), um zu sehen, was da drin ist.