Skip to content

Flaches und tiefes Kopieren in Python: copy(), deepcopy()

Python

In Python können Sie mit der Methode copy() von list , dictionary usw. oder den Funktionen copy() und deepcopy() des Moduls copy eine flache und tiefe Kopie erstellen.

Dieser Artikel hat folgenden Inhalt.

  • Flache Kopie und tiefe Kopie in Python
  • Zuweisung an eine andere Variable
  • Flache Kopie:copy(), copy.copy(), etc.
    • copy()-Methode von Liste, Wörterbuch usw.
    • Scheibe
    • list(), dict() usw.
    • kopieren.kopieren()


  • Tiefe Kopie:copy.deepcopy()

Das Folgende ist eine Zusammenfassung der Unterschiede zwischen der Zuweisung an eine andere Variable, einer flachen Kopie und einer tiefen Kopie.

import copy

l = [0, 1, [2, 3]]
l_assign = l                   # assignment
l_copy = l.copy()              # shallow copy
l_deepcopy = copy.deepcopy(l)  # deep copy

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_assign)
# [0, 100, [200, 3]]

print(l_copy)
# [0, 1, [200, 3]]

print(l_deepcopy)
# [0, 1, [2, 3]]

Flache Kopie und tiefe Kopie in Python

Die offizielle Python-Dokumentation Genaue flache Kopie und tiefe Kopie wie folgt.

Der Unterschied zwischen flachem und tiefem Kopieren ist nur für zusammengesetzte Objekte (Objekte, die anderen Objekte enthalten, wie Listen oder Klasseninstanzen) relevant:

Bei Objekten in änderbaren Objekten wie Listen und Wörterbüchern (= Elemente in einer Liste oder Werte in einem Wörterbuch) fügt flache Kopie Verweise und tiefe Kopie Kopien ein. Bei Referenzen handelt es sich um dasselbe Objekt, wenn auch eines von ihnen geändert WIRD, WIRD das andere ebenfalls geändert.

Zuweisung an eine andere Variable

Sehen wir uns zunächst an, was bei der Zuweisung an eine Variable passiert.

If ein änderbares Objekt wie eine Liste oder ein Wörterbuch Variablen zugewiesen IST, Werden beim Aktualisieren einer Variablen (= Ändern, Hinzufügen oder Löschen von Elementen usw.) auch die anderen mehrfachen Variablen aktualisiert.

l1 = [0, 1, [2, 3]]
l2 = l1

print(l1 is l2)
# True

l1[1] = 100
l1[2][0] = 200
print(l1)
# [0, 100, [200, 3]]

print(l2)
# [0, 100, [200, 3]]

print(l1 is l2)
# True

Wie SIE dem Ergebnis von entnehmen können, beziehen sich sterben Beide Variablen sowohl vor als auch nach der Änderung des Werts auf dasselbe Objekt.

Um anstelle einer Referenz desselben Objekts eine Kopie zu erstellen, verwenden SIE die Methode copy() oder die unten beschriebene Funktion copy.deepcopy().

Bei unveränderlichen Objekten wie Zahlen int, float und strings str dagegen kann der Wert des Objekts nicht aktualisiert werden. Bei der Zuweisung sind die beiden Variablen dasselbe Objekt, aber wenn eine auf einen neuen Wert aktualisiert WIRD, WIRD SIE zu einem anderen Objekt und sterben andere bleibt gleich.

i1 = 1
i2 = i1

print(i1 is i2)
# True

i1 += 100
print(i1)
# 101

print(i2)
# 1

print(i1 is i2)
# False

Flache Kopie:copy(), copy.copy(), etc.

copy()-Methode von Liste, Wörterbuch usw.

Die Methode copy() WIRD für Listen, Wörterbücher usw. bereitgestellt. Die Methode copy() erstellt eine flache Kopie.

Wie oben erwähnt, fügt eine flache Kopie einen Verweis auf ein Objekt in das ursprüngliche Objekt ein. Beispiel ist im Fall einer flachen Kopie einer Liste die Liste selbst ein anderes Objekt, aber ihre Elemente sind Verweise auf Objekte in den Elementen der ursprünglichen Liste.

l = [0, 1, [2, 3]]
l_copy = l.copy()

print(l is l_copy)
# False

print(l[2] is l_copy[2])
# True

If also sterben Elemente veränderlich Sind, WIRD Das andere ebenfalls aktualisiert, Wenn Eines aktualisiert WIRD. Im Falle eines unveränderlichen Objekts wird es, wenn es auf einen neuen Wert aktualisiert WIRD, zu einem anderen Objekt, und das andere bleibt das Original.

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_copy)
# [0, 1, [200, 3]]

print(l[2] is l_copy[2])
# True

Dasselbe gilt nicht nur für eine Liste von Listen wie im Beispiel Beispiel, sondern auch für eine Liste von Wörterbüchern, verschachtelte Wörterbücher (ein Wörterbuch, das Wörterbücher als Werte hat) usw.

Scheibe

Slices für veränderliche Sequenztypen, wie z. B. Anhören, ebenfalls flache Kopien erstellen.

Wenn Sie beispielsweise das Segment [:] anwenden, das alle Elemente angibt, WIRD Eine flache Kopie der gesamten Liste erstellt.

l = [0, 1, [2, 3]]
l_whole_slice = l[:]

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_whole_slice)
# [0, 1, [200, 3]]

Da die Methode copy() zu veränderlichen Sequenztypen in Python 3.3 hinzugefügt wurde, wurde die Technik des Erstellens einer flachen Kopie mit [:] zuvor häufig verwendet. Für neuen Code wäre es besser, die Methode copy() zu verwenden, um Ihre Absichten klarer zu machen.

Ein Slice für einen Teil macht auch eine flache Kopie.

l = [0, 1, [2, 3]]
l_slice = l[1:]
print(l_slice)
# [1, [2, 3]]

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_slice)
# [1, [200, 3]]

Wenn Sie eine tiefe Kopie erstellen möchten, können Sie die Funktion copy.deepcopy() für das Slice verwenden.

list(), dict() usw.

SIE can Eine Flache Kopie Einer Liste Oder Eines Wörterbuchs erstellen, Indem Sie Eine Liste An List() Oder Ein Wörterbuch An dict() Übergeben.

l = [0, 1, [2, 3]]
l_list = list(l)

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_list)
# [0, 1, [200, 3]]

kopieren.kopieren()

Es ist auch möglich, mit der Funktion copy() des Kopiermoduls eine flache Kopie zu erstellen.

l = [0, 1, [2, 3]]
l_copy = copy.copy(l)

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_copy)
# [0, 1, [200, 3]]

Verwenden Sie copy.copy(), wenn Sie eine flache Kopie eines Objekts erstellen möchten, für das sterben copy()-Methode nicht bereitgestellt WIRD.

Tiefe Kopie:copy.deepcopy()

Um eine tiefe Kopie zu erstellen, verwenden SIE sterben Funktion deepcopy() des Kopiermoduls.

l = [0, 1, [2, 3]]
l_deepcopy = copy.deepcopy(l)

print(l is l_deepcopy)
# False

print(l[2] is l_deepcopy[2])
# False

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_deepcopy)
# [0, 1, [2, 3]]

In einer tiefen Kopie werden Kopien anstelle von Verweisen auf Objekte eingefügt, sodass sich das ändert.

Im Folgenden finden Sie ein Beispiel für die Anwendung der deepcopy()-Funktion auf ein Slice.

l = [0, 1, [2, 3]]
l_slice_deepcopy = copy.deepcopy(l[1:])
print(l_slice_deepcopy)
# [1, [2, 3]]

l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]

print(l_slice_deepcopy)
# [1, [2, 3]]