Das Ergebnis der Ausführung mit Python 3.8.3.
Manchmal möchte ich eine Kopie der Liste erstellen, die Werte ändern und sie mit dem Original vergleichen. In diesem Fall müssen Sie mit der Deepcopy-Methode des Kopiermoduls wie folgt schreiben.
Wenn die Liste eindimensional ist, können Sie sie mit "deepcopy ()", Slice, "list ()" usw. kopieren.
list_copy_example_1.py
import copy
list_1 = [0,1,2]
list_2 = copy.deepcopy(list_1) #deepcopy()verwenden
list_3 = list_1[:] #Schneiden Sie die ursprüngliche Liste
list_4 = list(list_1) #list()verwenden
list_2[0] = 1000
list_3[0] = 2000
list_4[0] = 3000
print(list_1)
print(list_2)
print(list_3)
print(list_4)
Die Ausgabe sieht so aus.
[0, 1, 2]
[1000, 1, 2]
[2000, 1, 2]
[3000, 1, 2]
Wenn die Liste zweidimensional (oder höher) ist, können Sie sie mit "deepcopy ()" kopieren. Slicing und list ()
funktionieren nicht (siehe unten).
list_copy_example_2.py
import copy
list_1 = [[0,1,2], [3,4,5]]
list_2 = copy.deepcopy(list_1)
list_2[0][0] = 1000
print(list_1)
print(list_2)
Die Ausgabe sieht so aus.
[[0, 1, 2], [3, 4, 5]]
[[1000, 1, 2], [3, 4, 5]]
Da der Verweis auf die Liste selbst kopiert wird, wird auch der Wert der ursprünglichen Liste geändert.
anti_pattern_1.py
#=Ersetzen Sie mit
list_1 = [0,1,2,3]
list_2 = list_1
list_2[0] = 1000
print(list_1)
print(list_2)
Ausgabe
[1000, 1, 2, 3]
[1000, 1, 2, 3]
Die Geschichte, eine Kopie einer Python-Liste ohne Referenzübergabe zu erstellen besagt, dass es einfach ist, in Slices zu kopieren, aber dies ist eine ** Liste Nur in einer Dimension ** Funktioniert gut.
Wenn die Liste mehr als zwei Dimensionen hat, sieht sie folgendermaßen aus: Es scheint nicht zu funktionieren, da unterwegs eine Referenzübergabe erfolgt.
anti_pattern_2
#Kopieren Sie die ursprüngliche Liste in Scheiben(2D)
list_3 = [[0,1,2], [3,4,5]]
list_4 = list_3[:]
list_4[0][0] = 1000
print(list_3)
print(list_4)
Ausgabe
[[1000, 1, 2], [3, 4, 5]]
[[1000, 1, 2], [3, 4, 5]]
Sie können das gleiche Ergebnis auch erzielen, indem Sie die Methode list ()
verwenden, anstatt zu schneiden.
Wenn Sie eine Liste normal duplizieren, wird die Referenz selbst kopiert, nicht der Wert. Dies wird als ** flache Kopie ** bezeichnet. Umgekehrt wird das Kopieren nur des Werts als ** Deep Copy ** bezeichnet. In Python wird eine flache Kopie auf komplexe Objekte wie Listen und Wörterbücher angewendet, sofern nicht anders angegeben. Der Grund, warum die mehrdimensionale Liste beim Kopieren in Slices als Referenz übergeben wurde, liegt wahrscheinlich darin, dass die Kopie der zweiten Dimension innerhalb des Slice eine flache Kopie war.
Und die copy.deepcopy ()
Methode ist eine Anweisung zum "Erstellen einer tiefen Kopie". Damit wird sogar eine Kopie einer mehrdimensionalen Liste eine tiefe Kopie jedes Elements erstellen.
Weitere Informationen finden Sie im offiziellen Kopieren --- Flachkopieren und Tiefkopieren.
Slice für 1D-Liste, list ()
, copy.deepcopy ()
Copy.deepcopy ()
für mehrdimensionale Listen