Michael Schneider hat geschrieben:bords0 hat geschrieben:
Code: Alles auswählen
>>> from copy import deepcopy
>>> class C(object):
def show(self):
print id(self)
>>> c = C()
>>> c.show()
33135376
>>> deepcopy(c).show()
33135024
Und was soll dieses Beispiel zeigen? Es spricht doch eindeutig für Goswin, denn das
Verhalten ist dasselbe: es wird die ID des Objekts ausgegeben. Dass die Identität nicht dieselbe ist und nicht sein kann, das besagt schon der Name "Kopie" - bei Kopien von Schriftstücken wird auch ein neues Blatt Papier verwendet. Sonst hieße es "Original".
Goswin scheint zu glauben, dass man statt dem Original auch eine (tiefe) Kopie verwenden kann, und das gleiche Ergebnis erhält. Das ist aber nicht so. Das Beispiel zeigt dies nicht nur, sondern man kann ob der Simplizität auch sofort erkennen, dass das so sein
muss (wie du nochmals ausführlich erläutert hast).
Wenn das nicht mit Goswins Erwartungen zusammenpasst, liegt das also nicht daran, dass deepcopy etwas falsch macht. Letzteres scheint Goswin aber zu denken.
Michael Schneider hat geschrieben:bords0 hat geschrieben:
Code: Alles auswählen
>>> from copy import deepcopy
>>> class A(object):
def __init__(self, v):
self.v = v
def do_something(self):
d[0]=1
>>> d = {}
>>> a = A(d)
>>> b = deepcopy(a)
>>> a.v, b.v
({}, {})
>>> b.do_something()
>>> a.v, b.v
({0: 1}, {})
>>>
Auch das habe ich nicht verstanden. Für mich sieht es so aus, als ob Du b veränderst und a unverändert lässt. Da deepcopy auch die referenzierten Objekte kopiert, ist es doch richtig, dass sich nur eines ändert. Was willst Du mit dem Beispiel sagen?
Naja, wenn a.do_something a.v verändert, könnte man denken, dass bei der tiefen Kopie b ein aufruf von d.do_something b.v verändert und nicht a.v.
Michael Schneider hat geschrieben:
Wo sind die besagten Referenzen auf das Objekt bzw. darin enthaltene Objekte? Ich sehe nur in den Instanzen von A enthaltene Referenzen auf d...
Und d ist was? Ein Name für a.v.
Michael Schneider hat geschrieben:
Und schließlich, warum speicherst Du eigentlich v und referenzierst dann d??
Ich hoffe wirklich, dass das nur ein schlechtes Beispiel und nicht Dein Programmierstil ist.
Weil das die einfachste Möglichkeit ist, eine Referenz auf ein enthaltenes Objekt zu haben, die bei einem harmlos aussehenden Methodenaufruf verwendet wird, aber nicht einer tiefen Kopie mitkopiert wird.
bords