Hallo Liste, 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 * def prog1(): print 'p1:prog1 =', global_var p2.py ------- #!/usr/bin/env python # -*- coding: iso-8859-1 -* from tglob import * from p1 import * def pp(): global global_var print 'soll null =', global_var prog1() global_var = 'new' print 'soll new =', global_var prog1() # hier sollt auch 'new' erscheinen pp() Warum wird die globale_var nicht auch global geschrieben? Lesen funktioniert ja. Was mache ich da falsch? Wo ist mein Denkfehler? Wenn ich global_var als Liste oder Dict definieren funktioniert das prima. Bitte um Hilfe, stehe hier ziemlich auf dem Schlauch. Google und python.org helfen hier auch nicht weiter. -- cu Roland Kruggel mailto: rk.liste at bbf7.de System: Intel, Debian etch, 2.6.15, KDE 3.5 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo, in p1.py überschreibst Du mit from tglob import * doch global_var automatisch wieder mit 'null', oder sehe ich das falsch? MfG / Kind regards, Patrick Holz Roland M. Kruggel wrote:
Hallo Liste,
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 * def prog1(): print 'p1:prog1 =', global_var
p2.py ------- #!/usr/bin/env python # -*- coding: iso-8859-1 -* from tglob import * from p1 import * def pp(): global global_var print 'soll null =', global_var prog1() global_var = 'new' print 'soll new =', global_var prog1() # hier sollt auch 'new' erscheinen
pp()
Warum wird die globale_var nicht auch global geschrieben? Lesen funktioniert ja. Was mache ich da falsch? Wo ist mein Denkfehler?
Wenn ich global_var als Liste oder Dict definieren funktioniert das prima. Bitte um Hilfe, stehe hier ziemlich auf dem Schlauch. Google und python.org helfen hier auch nicht weiter.
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Am Montag, 24. April 2006 14:06 schrieb Stefan Schwarzer: [..]
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.
Danke für deine ausführliche Beschreibung. Jetzt habe ich das nicht nur verstanden sondern auch begriffen. Funktioniert bestens. Danke -- cu Roland Kruggel mailto: rk.liste at bbf7.de System: Intel, Debian etch, 2.6.15, KDE 3.5 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
natürlich auch ein dank an die anderen beiden :) -- cu Roland Kruggel mailto: rk.liste at bbf7.de System: Intel, Debian etch, 2.6.15, KDE 3.5 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Warum wird die globale_var nicht auch global geschrieben? Lesen funktioniert ja. Was mache ich da falsch? Wo ist mein Denkfehler?
List du eigentlich die Antorten die du hier bekommst? Vom 2.4.2006: """ from foo import * ist das Problem. Damit wird der Wert einer variable bar aus foo im _lokalen_ Namensraum des importierenden Moduls unter dem Namen bar angelegt. Du manipulierts also importer.bar und nicht foo.bar Lösung: from import * nicht benutzen - besser zb import langermodulnamedermichnervt as m """ Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (4)
-
Diez B. Roggisch
-
Patrick Holz
-
Roland M. Kruggel
-
Stefan Schwarzer