Heim >Backend-Entwicklung >Python-Tutorial >Shallow vs. Deep Copy in Python-Listen: Wann sollte ich „copy.deepcopy()' verwenden?

Shallow vs. Deep Copy in Python-Listen: Wann sollte ich „copy.deepcopy()' verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-09 20:51:11806Durchsuche

Shallow vs. Deep Copy in Python Lists: When Should I Use `copy.deepcopy()`?

Deep Copying Lists: Beyond Shallow Approaches

Wenn man versucht, eine Liste mit list(...) zu kopieren, könnte man annehmen, dass sie erstellt wird eine tiefe Kopie basierend auf der Beobachtung, dass sich id(E0) von id(E0_copy) unterscheidet. Diese Annahme ist jedoch fehlerhaft.

Shallow Copying Trap

list(...) führt keine tiefe Kopie durch, bei der innere Objekte rekursiv kopiert werden. Stattdessen wird nur die äußerste Liste kopiert und die Verweise auf die ursprünglichen inneren Listen beibehalten. Daher wirken sich Änderungen an den inneren Listen sowohl auf die ursprüngliche als auch auf die kopierte Liste aus.

Deep Copying mit copy.deepcopy

Um eine echte Deep Copy zu erstellen, verwenden Sie copy. Deepcopy(...). Diese Methode kopiert rekursiv alle Ebenen von Objekten und stellt so sicher, dass Änderungen an der Kopie keine Auswirkungen auf das Original haben.

Beispiel

Bedenken Sie den folgenden Codeausschnitt:

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b   # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]

In diesem Beispiel erstellt list(...) eine flache Kopie von a. Wenn a[0][1] geändert wird, ändert sich auch b, was darauf hinweist, dass sie auf dieselben inneren Listen verweisen.

Vergleichen Sie dies mit Folgendem:

>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b    # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]

Mit copy.deepcopy, Wir erstellen eine echte tiefe Kopie von a. Änderungen an a wirken sich nicht auf b aus und bestätigen, dass es sich um unterschiedliche Objekte mit eigenen Kopien innerer Listen handelt.

Fazit

Wenn das tiefe Kopieren von Listen unerlässlich ist, denken Sie daran Verwenden Sie copy.deepcopy(...), um sicherzustellen, dass Änderungen an der Kopie keine Auswirkungen auf das Original haben. Dieses Verständnis ist entscheidend für die Aufrechterhaltung der Datenintegrität und die Vermeidung unerwarteter Konsequenzen in Ihrem Code.

Das obige ist der detaillierte Inhalt vonShallow vs. Deep Copy in Python-Listen: Wann sollte ich „copy.deepcopy()' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn