Seite 1 von 1
Objekte und ihre Kopien mit =
Verfasst: Freitag 29. Juli 2011, 17:54
von Lasse
Ich habe ein klitzekleines Problem (genau 5 Zeilen lang

) Wenn ich dieses Beispiel ausführe und A_Object.a am Ende anzeige ist es auch 2. Das ist sehr nützlich für mein Programm, aber kann man sich darauf verlassen?
Soweit ich weiß hat dieses Verhalten etwas mit Speichersparen und das Python Objekte dann gerne zusammenlegt zu tun.
Re: Objekte und ihre Kopien mit =
Verfasst: Freitag 29. Juli 2011, 18:11
von Hyperion
Du hast es zwar etwas plump ausgedrückt, aber im Kern stimmt das schon so. Du bindest in Python Objekte an Namen. Mit `A()` erzeugst Du ein neues Objekt der Klasse A, welches Du dann nur an verschiedene Namen bindest. Insofern ist das wenig überraschend. Du kannst ja mal folgendes eingeben:
Das Ergebnis bestätigt, dass es sich um ein und dasselbe Objekt handelt.
Re: Objekte und ihre Kopien mit =
Verfasst: Freitag 29. Juli 2011, 18:46
von cofi
Lasse hat geschrieben:Soweit ich weiß hat dieses Verhalten etwas mit Speichersparen und das Python Objekte dann gerne zusammenlegt zu tun.
Nein. Die Semantik von `=` ist eine andere als du denkst: Es werden _nie_ Kopien angefertigt, sondern die Objekte auf der rechten Seite werden an den Namen auf der linken Seite gebunden.
Und bevor du darueber stolperst: Mit `Y.a = 2` erstellst du einen neuen Namen _in der Instanz_ du veraenderst nicht den Namen `a` in der Klasse. `A.a` ist danach immernoch 1.
Und dann noch mit veraenderbaren Objekten, damit es auch richtig lustig wird:
Code: Alles auswählen
In [2]: class A:
...: a = []
...:
In [3]: a = A(); b = A(); c = A()
In [4]: a.a = a.a + [1,2]; b.a.extend([3,4]) ; c.a += [5,6]
In [5]: a.a, b.a, c.a, A.a
Out[5]: ([1, 2], [3, 4, 5, 6], [3, 4, 5, 6], [3, 4, 5, 6])
Re: Objekte und ihre Kopien mit =
Verfasst: Freitag 29. Juli 2011, 20:42
von Lasse
Danke die Antworten, jetzt weiß ich, dass es immer funktioniert,ebenauch das ich die Klasse selbst nicht verändere, wäre sonst auch ziemlich unpraktisch.
