wo wir grad bei Modulen sind...

Christian Tismer tismer at appliedbiometrics.com
Sun May 10 21:57:22 EDT 1998


Status: RO

Heho,

Georg Mischler wrote:
> 
> Christian Tismer erlaeuterte:

[laber sülz dozier]

> Ouch!
> Das wiederspricht einer meiner Behauptungen von kuerzlich... sollte
> die
> Verwirrung etwa bei mir zuhause sein?

Glaub schon, darauf hatte ich spekuliert, weil das eins der 
häufigsten Aha-Effekte nach einiger Zeit mit Python ist.
Ich glaub das ist einen FAQ-Eintrag wert. Warum sollen alle
erstmal stolpern?

> Ich habe das eben mal exemplarisch mit zwei kleinen modulen
> ausprobiert,
> und bin dabei wiedermal wesentlich schlauer geworden!
> 
> Der erste Versuch war mit einfachen Variablen, welche einen integer
> zugewiesen kriegen. Hier hat es, wie ich erwartete, nicht
> funktioniert.
> D.h. die lokale Kopie (nach from a import *) kann geaendert werden,
> ohne dass das Original etwas davon erfaehrt. Umgekehrt kann ich per
> Zugriffsfunktion im Originalmodul den "remote"-Wert setzen, ohne dass
> dies meine lokale Kopie beeinflusst.

Sicher. Die "einfache Variable" ist ja auch ein immutable Object,
sodaß Du gezwungenermaßen das ganze DIngs am Stück zuweisen
mußtest, und das haut das referenzierte Object immer weg (ob imm-
oder mutable).

> Zum Glueck habe ich das ganze dann noch mit einer Liste getestet...
> 
> Soweit ich es jetzt verstehe, aendert die Anwendung von "import foo"
> oder "from foo import *" nur etwas fuer immutable Typen. Ist das
> richtig?

Noch nicht ganz sicher. Der Import macht exakt dasselbe: Er läßt
irgendwelche Objekte in Deinem aktuellen Modul mit *Namen* erscheinen.
Nebenher wird das import-Modul noch initialisiert wenn noch nicht
geschehen, aber mehr isses nich.

# Egal was
from moda import a
# bedeutet, wenn Du sagst
a = 5
# dann ist a = 5 und hat nichts mehr mit Modul "moda" zu tun.

# Umgekehrt, wenn Du explizit sagst
import moda
# dann hast Du nur *einen* Namen erzeugt, Dein aktuelles Modul
# enthält einen neuen Namen "moda", an dem Modul "moda" bammelt.
# Dieses Modul kannst Du jetzt als Objekt mißbrauchen und
moda.a = 5
# schreiben. Du hast eine "Eigenschaft" von moda geändert.
# noch doller: ANgenommen moda enthält *keine* Variable "b"
# dann wird mit
moda.b = 7
# der globale Namespace von "moda" modifiziert.

EndOfPythonMode.

Der Knackpunkt ist: Modifizieren von shared mutable objects.
Module gehören dazu, deshalb geht das obige. Aber es gilt
für alle mutables, wenn Du es schaffst, über irgendwelche
Pfade wie Namen, oder Referenzen aus anderen Objekten, egal,
auf ein veränderliches Objekt zuzugreifen, dann wirkt sich
jede Änderung auf alle Referenzen mit aus, *eben weil* immer
diese Pfade gegangen werden.

Also das Bapperl-Modell ist glaub ich leicher zu verstehen...

> Langsam wird so auch die Python-Philosophie fuer Zuweisungen etwas
> transparenter...einfach genau umgekehrt wie ueblich ;). Und noch eine

Na das seh ich nicht ganz so. Eigentlich passiert genau das, was in C
bei einer Pointer-Zuweisung passiert. "Umgekehrt" evtl. wenn Du an
Pascal-Records denkst, die herumkopiert werden, mag sein.

> Eigenheit wird deutlich, welche obiges wahrscheinlich voraussetzt:
> "Die Zahl fuenf gibt's nur einmal!"

Im Endeffekt ja. Hängt von der Implementierung ab. Einige Objekte
gibt's tatsächlich nur einmal, andere benehmen sich nur so.
In der Tat gibt es die Zahlen -99 bis 99 exakt nur einmal.

> Als Fazit: Dass Du bei obigem Beispiel gerade ein dict zur globalen
> Datenhaltung nimmst, ist definitiv kein Zufall! Ohne den kurzen

Ahh, nu hatter's.

> Test waere ich sicher gelegentlich noch mal ueber dieses "feature"
> gestolpert (ich bin ja auch kein Informatier ;), obwohl ich meistens
> der Schoenheit halber voll qualifizierte Namen verwende.

Bin auch bloß Mathematier, aber ich lern's schon noch

wuff-wuff - pirx
-- 
Christian Tismer             :^)   <mailto:tismer at appliedbiometrics.com>
Applied Biometrics GmbH      :     Have a break! Take a ride on Python's
Kaiserin-Augusta-Allee 101   :    *Starship* http://starship.skyport.net
10553 Berlin                 :     PGP key -> http://pgpkeys.mit.edu
     we're tired of banana software - shipped green, ripens at home

______________________________________________________________
   python-de          the German Python mailing list
send messages to:   <mailto:python-de at solar.skyport.net>
list manager: <mailto:owner-python-de at solar.skyport.net>
______________________________________________________________




More information about the Python-de mailing list