[Python-de] globale variablen
Stefan Schwarzer
sschwarzer at sschwarzer.net
Mon Apr 24 14:06:06 CEST 2006
Hallo Roland,
On 2006-04-24 13:47, Roland M. Kruggel wrote:
> ich dachte eigentlich ich hätte die Namespaces in Python verstanden,
> bin aber jetzt eines Besseren belehrt worden.
>
> Folgendes Beispiel:
>
> tglob.py
> ---------
> global_var = 'null'
> ...
>
> p1.py
> ------
> # -*- coding: iso-8859-1 -*
> from tglob import *
Das legt im Namensraum des Moduls p1 einen Namen global_var an,
der auf das Objekt verweist, das auch mit tglob.global_var
referenziert werden kann.
> def prog1():
> print 'p1:prog1 =', global_var
Soweit ok.
> p2.py
> -------
> #!/usr/bin/env python
> # -*- coding: iso-8859-1 -*
> from tglob import *
Wie oben, aber der neue Name wird in Modul p2 erzeugt.
> from p1 import *
Bis hier verweisen alle Namen global_var aufs gleiche Objekt.
> def pp():
> global global_var
> print 'soll null =', global_var
Das bezieht sich auf global_var im Namensraum von p2.
> prog1()
Gibt das Objekt aus, auf das p1.global_var verweist.
> global_var = 'new'
Legt ein neues Objekt "new" an und bindet es an den Namen
global_var in Namensraum des Moduls p2. Die Namen global_var
in den Modulen tglob und p1 verweisen weiter auf das Objekt
"null"!
> print 'soll new =', global_var
Gibt das Objekt aus, auf das p2.global_var verweist.
> prog1() # hier sollt auch 'new' erscheinen
Nein, sollte es nicht! ;-)
> pp()
>
> Warum wird die globale_var nicht auch global geschrieben? Lesen
> funktioniert ja. Was mache ich da falsch? Wo ist mein Denkfehler?
Siehe oben.
> Wenn ich global_var als Liste oder Dict definieren funktioniert das
> prima.
In dem Fall änderst du das Objekt in-place, richtig? ;-)
> Bitte um Hilfe, stehe hier ziemlich auf dem Schlauch. Google
> und python.org helfen hier auch nicht weiter.
Abhilfe: Wenn du globale Variablen verwenden willst, importiere
einfach das entsprechende Modul (hier: import tglob ) und
arbeite in allen Modulen nur explizit mit tglob.global_var .
Unter anderem wegen der hier zu beobachtenden Effekte wird von
der Benutzung von from modul import * abgeraten.
Viele Grüße
Stefan