[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