Konflikt mit globalen Variablen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
calo
User
Beiträge: 41
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Freitag 11. Januar 2008, 18:10

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 11. Januar 2008, 18:34

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Freitag 11. Januar 2008, 19:18

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.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Antworten