GIST do przyjęcia jest następujący: Radzenie sobie z płytkimi listami (bez pod_list, tylko pojedynczych elementów) za pomocą „normalnego przypisania” zwiększa „efekt uboczny” podczas tworzenia płytkiej listy, a następnie tworzysz kopię tej listy za pomocą „normalnego przypisania” . Ten „efekt uboczny” występuje, gdy zmienisz dowolny element utworzonej listy kopii, ponieważ automatycznie zmieni on te same elementy oryginalnej listy. Jest to copy
przydatne, ponieważ nie zmienia oryginalnych elementów listy podczas zmiany elementów kopiujących.
Z drugiej strony copy
ma również „efekt uboczny”, gdy masz listę, która zawiera listy (listy_list) i deepcopy
rozwiązuje ją. Na przykład, jeśli utworzysz dużą listę, w której znajdują się zagnieżdżone listy (listy_list), i utworzysz kopię tej dużej listy (lista oryginalna). „Efekt uboczny” pojawiłby się, gdy zmodyfikujesz listy podrzędne listy kopii, która automatycznie zmodyfikuje listy podrzędne dużej listy. Czasami (w niektórych projektach) chcesz zachować dużą listę (oryginalną listę) bez zmian, a wszystko, czego potrzebujesz, to zrobić kopię jej elementów (listy_list). W tym celu Twoim rozwiązaniem jest użycie, deepcopy
które zajmie się tym „efektem ubocznym” i wykona kopię bez modyfikowania oryginalnej treści.
Różne zachowania copy
i deep copy
operacje dotyczą tylko obiektów złożonych (tj. Obiektów zawierających inne obiekty, takie jak listy).
Oto różnice zilustrowane w tym prostym przykładzie kodu:
Pierwszy
sprawdźmy, jak się copy
zachowuje (płytki), tworząc oryginalną listę i kopię tej listy:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Teraz uruchommy kilka print
testów i zobaczmy, jak zachowuje się oryginalna lista w porównaniu do listy kopii:
lista_oryginałów i lista_kopii ma różne adresy
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
elementy original_list i copy_list mają te same adresy
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
podelementy listy_oryginalnej i listy_kopii mają te same adresy
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
modyfikowanie elementów original_list NIE modyfikuje elementów copy_list
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']]
modyfikowanie elementów copy_list NIE modyfikuje elementów original_list
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]
modyfikowanie pod_elementów lista_oryginalna automatycznie modyfikuje pod_elementy lista_kopii
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]
modyfikowanie pod_elementów lista_kopii automatycznie modyfikuje pod_elementy lista_oryginalnych
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]
druga
sprawdźmy, jak się deepcopy
zachowujemy, robiąc to samo co my copy
(tworząc oryginalną listę i kopię tej listy):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Teraz uruchommy kilka print
testów i zobaczmy, jak zachowuje się oryginalna lista w porównaniu do listy kopii:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
lista_oryginałów i lista_kopii ma różne adresy
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
elementy original_list i copy_list mają te same adresy
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
podelementy listy_oryginalnej i listy_kopii mają różne adresy
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
modyfikowanie elementów original_list NIE modyfikuje elementów copy_list
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']]
modyfikowanie elementów copy_list NIE modyfikuje elementów original_list
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]
modyfikowanie elementów podrzędnych lista_oryginalna NIE modyfikuje elementów podrzędnych lista_kopii
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]
modyfikowanie podelementów lista_listy NIE modyfikuje podelementów lista_oryginalna
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]