Der GIST lautet wie folgt: Der Umgang mit flachen Listen (keine Unterlisten, nur einzelne Elemente) mit "normaler Zuordnung" führt zu einem "Nebeneffekt", wenn Sie eine flache Liste erstellen und dann eine Kopie dieser Liste mit "normaler Zuordnung" erstellen. . Dieser "Nebeneffekt" tritt auf, wenn Sie ein Element der erstellten Kopierliste ändern, da automatisch dieselben Elemente der ursprünglichen Liste geändert werden. Dies ist copy
praktisch, da die ursprünglichen Listenelemente beim Ändern der Kopierelemente nicht geändert werden.
Auf der anderen Seite hat copy
dies auch einen "Nebeneffekt", wenn Sie eine Liste mit Listen (Unterlisten) haben und diese deepcopy
lösen. Wenn Sie beispielsweise eine große Liste mit verschachtelten Listen (Unterlisten) erstellen und eine Kopie dieser großen Liste (der ursprünglichen Liste) erstellen. Der "Nebeneffekt" würde auftreten, wenn Sie die Unterlisten der Kopierliste ändern, wodurch die Unterlisten der großen Liste automatisch geändert werden. Manchmal (in einigen Projekten) möchten Sie die große Liste (Ihre ursprüngliche Liste) unverändert lassen, und Sie möchten lediglich eine Kopie ihrer Elemente (Unterlisten) erstellen. Zu deepcopy
diesem Zweck verwenden Sie eine Lösung, die diesen "Nebeneffekt" beseitigt und eine Kopie erstellt, ohne den ursprünglichen Inhalt zu ändern.
Das unterschiedliche Verhalten copy
und die unterschiedlichen deep copy
Operationen betreffen nur zusammengesetzte Objekte (dh Objekte, die andere Objekte wie Listen enthalten).
In diesem einfachen Codebeispiel sind die Unterschiede dargestellt:
Zuerst
Lassen Sie uns überprüfen, wie sich copy
(flach) verhält, indem wir eine Originalliste und eine Kopie dieser Liste erstellen:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Lassen Sie uns nun einige print
Tests durchführen und sehen, wie sich die ursprüngliche Liste im Vergleich zur Kopierliste verhält:
original_list und copy_list haben unterschiedliche Adressen
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
Elemente von original_list und copy_list haben die gleichen Adressen
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
Unterelemente von original_list und copy_list haben die gleichen Adressen
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
Durch Ändern der Elemente von original_list werden die Elemente von copy_list NICHT geändert
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
Durch Ändern von copy_list-Elementen werden original_list-Elemente NICHT geändert
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
Ändern von original_list-Unterelementen Ändern Sie automatisch copy_list-Unterelemente
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
Ändern von copy_list-Unterelementen Ändern Sie automatisch original_list-Unterelemente
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
Zweite
Lassen Sie uns überprüfen, wie deepcopy
wir uns verhalten, indem wir dasselbe tun wie bei copy
(Erstellen einer Originalliste und einer Kopie dieser Liste):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Lassen Sie uns nun einige print
Tests durchführen und sehen, wie sich die ursprüngliche Liste im Vergleich zur Kopierliste verhält:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list und copy_list haben unterschiedliche Adressen
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
Elemente von original_list und copy_list haben die gleichen Adressen
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
Unterelemente von original_list und copy_list haben unterschiedliche Adressen
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
Durch Ändern der Elemente von original_list werden die Elemente von copy_list NICHT geändert
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
Durch Ändern von copy_list-Elementen werden original_list-Elemente NICHT geändert
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
Durch Ändern von original_list sub_elements werden die copy_list sub_elements NICHT geändert
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
Durch Ändern von copy_list sub_elements werden original_list sub_elements NICHT geändert
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]