ГИСТ, чтобы взять это: Работа с неглубокими списками (без подсписков, только с отдельными элементами) с использованием «нормального присваивания» вызывает «побочный эффект», когда вы создаете неглубокий список, а затем вы создаете копию этого списка с помощью «нормального присваивания» , Этот «побочный эффект» возникает при изменении любого элемента созданного списка копирования, поскольку он автоматически изменит те же элементы исходного списка. Это когда copy
пригодится, так как это не изменит исходные элементы списка при изменении копирующих элементов.
С другой стороны, copy
также имеет «побочный эффект», когда у вас есть список, в котором есть списки (sub_lists), и deepcopy
он решает его. Например, если вы создаете большой список, в котором есть вложенные списки (sub_lists), и вы создаете копию этого большого списка (исходный список). «Побочный эффект» возникает, когда вы изменяете подсписки списка копирования, которые автоматически изменяют подсписки большого списка. Иногда (в некоторых проектах) вы хотите сохранить большой список (ваш первоначальный список) без изменений, и все, что вам нужно, - это сделать копию его элементов (sub_lists). Для этого ваше решение заключается в использованииdeepcopy
которое позаботится об этом «побочном эффекте» и сделает копию без изменения исходного содержимого.
Различное поведение copy
и deep copy
операции касаются только составных объектов (т. Е. Объектов, которые содержат другие объекты, такие как списки).
Вот различия, показанные в этом простом примере кода:
Первый
давайте проверим, как copy
(поверхностно) себя ведет, создав оригинальный список и копию этого списка:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Теперь давайте запустим несколько print
тестов и посмотрим, как ведет себя оригинальный список по сравнению со списком копий:
original_list и copy_list имеют разные адреса
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
элементы original_list и copy_list имеют одинаковые адреса
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements of original_list и copy_list имеют одинаковые адреса
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
изменение элементов original_list НЕ изменяет элементы 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']]
изменение элементов copy_list НЕ изменяет элементы 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]
изменение sub_elements original_list автоматически изменяет sub_elements copy_list
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]
изменение sub_elements copy_list автоматически изменяет sub_elements original_list
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]
второй
давайте проверим, как deepcopy
ведет себя, делая то же самое, что и мы copy
(создавая оригинальный список и копию этого списка):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Теперь давайте запустим несколько print
тестов и посмотрим, как ведет себя оригинальный список по сравнению со списком копий:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list и copy_list имеют разные адреса
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
элементы original_list и copy_list имеют одинаковые адреса
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements в original_list и copy_list имеют разные адреса
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
изменение элементов original_list НЕ изменяет элементы 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']]
изменение элементов copy_list НЕ изменяет элементы 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]
модификация original_list sub_elements НЕ изменяет copy_list sub_elements
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]
изменение copy_list sub_elements НЕ изменяет original_list sub_elements
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]