Wie kann ich eine Kopie eines Objekts in Python erstellen?
Ich würde gerne zum erstellen einer Kopie eines Objekts. Ich möchte das neue Objekt zu besitzen, die alle Eigenschaften des alten Objekts (Werte der Felder). Aber ich möchte unabhängige Objekte. Also, wenn ich ändern Sie die Werte der Felder des neuen Objektes das alte Objekt nicht berührt werden sollte.
Kommentar zu dem Problem
Haben Sie einen Blick auf die
kopieren.deepcopy()
- Funktion. Es sollte genau das tun, was Sie brauchen. Auch haben Sie einen Blick auf diese Antwort, um eine Frage im Zusammenhang für eine schöne Erklärung. InformationsquelleAutor der Frage Roman | 2011-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du meinst ein veränderliches Objekt.
In Python 3, Listen bekommen
copy
Methode (in 2, die Sie verwenden würden, eine Scheibe zu machen eine Kopie):Flache Kopien
Flache Kopien sind nur Kopien von den äußersten container.
list.copy
ist eine flache Kopie:Bekommen Sie nicht, eine Kopie der inneren Objekte. Sie sind die gleiche Objekt - also, wenn Sie mutiert, die änderung zeigt sich in beiden Behältern.
Tiefe Kopien
Tiefen Kopien werden rekursiv Kopien von jeder interior-Objekt.
Änderungen nicht in das original, nur in der Kopie.
Unveränderliche Objekte
Immutable Objekte in der Regel nicht kopiert werden müssen. In der Tat, wenn Sie versuchen, Python wird nur geben Sie das ursprüngliche Objekt:
Tupel, die nicht einmal einen copy-Methode, also versuchen wir es mit einer Scheibe:
Aber sehen wir, es ist das gleiche Objekt:
Ebenso für Streicher:
und für frozensets, obwohl Sie ein
copy
Methode:Beim kopieren unveränderliche Objekte
Unveränderliche Objekte sollte kopiert werden, wenn Sie brauchen eine veränderliche interior-Objekt kopiert.
Wie wir sehen können, wenn das innere Objekt der Kopie mutiert ist, das original nicht nicht ändern.
Benutzerdefinierter Objekte
Benutzerdefinierten Objekte, die in der Regel speichern von Daten in einem
__dict__
Attribut oder in__slots__
(einer Tupel-wie Speicher-Struktur.)Machen kopierbar Objekts definieren
__copy__
(für flache Kopien) und/oder__deepcopy__
(für Tiefe Kopien).Beachten Sie, dass
deepcopy
hält eine memoization Wörterbuchid(original)
(oder id-Nummern) kopiert. Genießen Sie gutes Verhalten mit rekursiven Datenstrukturen, stellen Sie sicher, dass Sie nicht bereits eine Kopie, und wenn Sie haben, zurückzukehren.Machen wir also ein Objekt:
Sowie
copy
macht eine flache Kopie:Sowie
deepcopy
macht nun eine Tiefe Kopie:InformationsquelleAutor der Antwort Aaron Hall
Glaube ich, dass die folgenden arbeiten sollten mit vielen wohlerzogen eingestuft in Python:
(Natürlich, ich Rede hier nicht von "deep Kopien", das ist eine andere Geschichte, und die kann nicht ein sehr klares Konzept-wie tief ist tief genug?)
Nach meinen tests mit Python 3, für unveränderliche Objekte, wie Tupel oder strings, es gibt das gleiche Objekt zurück (weil es nicht nötig ist, um eine flache Kopie eines unveränderlichen Objekts), aber für Listen oder dictionaries schafft es eine unabhängige flache Kopie.
Natürlich diese Methode funktioniert nur für Klassen, deren Verhalten sich die Konstruktoren entsprechend an. Mögliche Anwendungsfälle: einen flachen Kopie des standard-Python-container-Klasse.
InformationsquelleAutor der Antwort Alexey