copy — Flache und tiefe Kopieroperationen¶
Quellcode: Lib/copy.py
Zuweisungsanweisungen in Python kopieren Objekte nicht, sondern erstellen Bindungen zwischen einem Ziel und einem Objekt. Für Sammlungen, die veränderlich sind oder veränderliche Elemente enthalten, ist manchmal eine Kopie erforderlich, damit man eine Kopie ändern kann, ohne die andere zu ändern. Dieses Modul bietet allgemeine flache und tiefe Kopieroperationen (weiter unten erklärt).
Schnittstellenübersicht
- copy.copy(obj)¶
Gibt eine flache Kopie von obj zurück.
- copy.deepcopy(obj[, memo])¶
Gibt eine tiefe Kopie von obj zurück.
- copy.replace(obj, /, **changes)¶
Erstellt ein neues Objekt desselben Typs wie obj und ersetzt Felder mit Werten aus changes.
Hinzugefügt in Version 3.13.
- exception copy.Error¶
Wird für modulspezifische Fehler ausgelöst.
Der Unterschied zwischen flacher und tiefer Kopie ist nur für zusammengesetzte Objekte (Objekte, die andere Objekte enthalten, wie Listen oder Klasseninstanzen) relevant.
Eine flache Kopie konstruiert ein neues zusammengesetztes Objekt und fügt dann (soweit möglich) Referenzen auf die im Original gefundenen Objekte ein.
Eine tiefe Kopie konstruiert ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien der im Original gefundenen Objekte ein.
Zwei Probleme treten bei tiefen Kopieroperationen häufig auf, die bei flachen Kopieroperationen nicht vorhanden sind.
Rekursive Objekte (zusammengesetzte Objekte, die direkt oder indirekt eine Referenz auf sich selbst enthalten) können eine Endlosschleife verursachen.
Da die tiefe Kopie alles kopiert, kann sie zu viel kopieren, z. B. Daten, die zwischen Kopien geteilt werden sollen.
Die Funktion deepcopy() vermeidet diese Probleme, indem sie
ein
memo-Wörterbuch mit Objekten führt, die während des aktuellen Kopiervorgangs bereits kopiert wurden; undBenutzerdefinierte Klassen das Kopieren oder die zu kopierenden Komponenten überschreiben lässt.
Dieses Modul kopiert keine Typen wie Module, Methoden, Stack-Trace, Stack-Frame, Dateien, Sockets, Fenster oder ähnliche Typen. Es kopiert Funktionen und Klassen (flach und tief), indem es das Originalobjekt unverändert zurückgibt; dies ist mit der Behandlung dieser durch das Modul pickle kompatibel.
Flache Kopien von Wörterbüchern können mit dict.copy() und von Listen durch Zuweisung eines Slices der gesamten Liste, z. B. copied_list = original_list[:], erstellt werden.
Klassen können dieselben Schnittstellen zur Steuerung des Kopierens verwenden, die sie zur Steuerung des Picklings verwenden. Informationen zu diesen Methoden finden Sie in der Beschreibung des Moduls pickle. Tatsächlich verwendet das Modul copy die registrierten Pickle-Funktionen aus dem Modul copyreg.
Damit eine Klasse ihre eigene Kopierimplementierung definieren kann, kann sie die speziellen Methoden __copy__() und __deepcopy__() definieren.
- object.__copy__(self)¶
Wird aufgerufen, um die flache Kopieroperation zu implementieren; es werden keine zusätzlichen Argumente übergeben.
- object.__deepcopy__(self, memo)¶
Wird aufgerufen, um die tiefe Kopieroperation zu implementieren; es wird ein Argument übergeben, das memo-Wörterbuch. Wenn die Implementierung von
__deepcopy__eine tiefe Kopie einer Komponente erstellen muss, sollte sie die Funktiondeepcopy()mit der Komponente als erstes Argument und dem memo-Wörterbuch als zweites Argument aufrufen. Das memo-Wörterbuch sollte als undurchsichtiges Objekt behandelt werden.
Die Funktion copy.replace() ist eingeschränkter als copy() und deepcopy() und unterstützt nur benannte Tupel, die von namedtuple(), dataclasses und andere Klassen erstellt wurden, die die Methode __replace__() definieren.
- object.__replace__(self, /, **changes)¶
Diese Methode sollte ein neues Objekt desselben Typs erstellen und Felder mit Werten aus changes ersetzen.
Hinzugefügt in Version 3.13.
Siehe auch
- Modul
pickle Diskussion der speziellen Methoden, die zur Unterstützung des Abrufs und der Wiederherstellung des Objektzustands verwendet werden.