2021-09-23 10:01:34
Пояснение про копирование В прошлом посте вот этот пример вызвал вопросы:
arr = [1, 2, 3, 4, 5, 6, 7, 8]
bar = arr[1:6]
bar[3] = 8888
print(bar) # [2, 3, 4, 8888, 6] - новый изменен
print(arr) # [1, 2, 3, 4, 5, 6, 7, 8] – старый без изменений!
Как же так? Ты говоришь про
поверхностное копирование, но приводишь пример, где элементы копируются полностью? Да, я использовал числа для простоты примера, и может показаться, что копия полная, а не поверхностная. Докажу вам обратное:
list1 = [333, 444]
list2 = list1[:] # копия
id(list1[0]) == id(list2[0]) # True
Оба списка имеют один и тот же объект (по тому же самому адресу) в своем составе!
Просто числа – объекты
неизменяемые, иными словами, когда вы присваиваете число, то не меняете содержимое объекта по текущему адресу, вы привязываете переменную к новому объекту в другом месте памяти. А равные числа выглядят одинаково, независимо от того, в каком месте памяти они лежат
Для наглядности, давайте в качестве элемента списка возьмем
изменяемый тип, например, опять же список. Изменения
в элементе списка
list1 затронут копированный поверхностно список
list2.
list1 = [ [], [] ]
list2 = list1[:]
list1[0].append('surprise')
print(list2[0]) # ['surprise']
Таким образом, поверхностная копия копирует только: количество элементов и их порядок, а сами элементы остаются ссылками на старые объекты. То есть если вы начнете добавлять, удалять, менять местами элементы
list1, то порядок в
list2 не пострадает. Но если вы сможете изменить
внутреннее содержимое элементов списка
list1, которые остались в
list2, тогда оно будет затронуто в обоих местах.
Для полной
глубокой копии используют библиотечную функцию
deepcopy, которая рекурсивно копирует объекты:
from copy import deepcopy
list1 = [ [], [] ]
list2 = deepcopy(list1) #
list1[0].append('surprise')
print(f"{list1 = }, {list2 = }")
# list1 = [['surprise'], []], list2 = [[], []] - изменение не отразилось
id(list1[0]) == id(list2[0]) # False – разные объекты!
Надеюсь, что объяснил. Если что, спрашивайте еще.
376 views07:01