In Python kann das Kopieren von Objekten entweder oberflächlich (shallow copy) oder tief (deep copy) erfolgen. Eine oberflächliche Kopie erstellt einen neuen Container, kopiert jedoch nicht die eingebetteten Objekte, sondern verwendet Verweise auf dieselben Objekte. Eine tiefe Kopie erstellt rekursiv neue Kopien aller eingebetteten Objekte und gewährleistet damit die Unabhängigkeit der Kopie.
Das Modul copy bietet die Methoden copy() (shallow copy) und deepcopy() (deep copy):
import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) deep = copy.deepcopy(original) shallow[0][0] = 99 print(original) # [[99, 2], [3, 4]] ← das ursprüngliche Objekt hat sich geändert! deep[1][1] = 42 print(original) # [[99, 2], [3, 4]] - hat sich nicht geändert
Was ist der Unterschied zwischen dem Operator
list2 = list1und der Anwendung von copy.copy(list1)?
Antwort: Der Operator list2 = list1 erstellt einen neuen Verweis auf dasselbe Objekt. copy.copy(list1) erstellt eine oberflächliche Kopie, indem es ein neues Listenobjekt mit denselben internen Objekten erstellt. Für verschachtelte Strukturen ist eine oberflächliche Kopie unzureichend - eine tiefe Kopie ist erforderlich.
Geschichte
Bei der Entwicklung eines REST-APIs wurden Daten aus einer Vorlage durch einfache Zuweisung (
data = template) kopiert. Die folgende Anfrage änderte versehentlich die "Vorlage" für alle nachfolgenden Benutzer, da dasselbe Verweis verwendet wurde.
Geschichte
Im Berichtmodul wurden die Daten durch
copy.copy()kopiert, obwohl die Struktur verschachtelt war (Listen in Dictionaries). Änderungen in der Kopie spiegelten sich unerwartet in den Originaldaten wider, was zu Fehlern in der Statistik führte.
Geschichte
In einem Bankprojekt führte eine fehlerhafte Kopie eines komplizierten verschachtelten Objekts durch
copy.copy()(anstattdeepcopy()) zu einem Verlust der Transaktionshistorie - neue Operationen überschrieben alte, da die eingebetteten Elemente gemeinsam genutzt wurden.