ProgrammierungPython Entwickler

Beschreiben Sie den Unterschied zwischen shallow copy und deep copy in Python. Wie kopiert man korrekt verschachtelte Datenstrukturen? Wie funktioniert das Modul copy?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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

Fangfrage.

Was ist der Unterschied zwischen dem Operator list2 = list1 und 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.

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


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() (anstatt deepcopy()) zu einem Verlust der Transaktionshistorie - neue Operationen überschrieben alte, da die eingebetteten Elemente gemeinsam genutzt wurden.