Вопрос35
Осталось:

Чем отличается глубокое копирование от поверхностного?

Образцовый ответ

Показывать ответ по умолчанию

Поверхностное копирование:

Создаёт новый объект, но вложенные объекты не копируются — сохраняются ссылки на оригиналы:

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)

shallow[0][0] = 999
print(original[0][0])  # 999 — изменился и оригинал!

Глубокое копирование:

Создаёт полностью независимую копию, включая все вложенные объекты:

import copy

original = [[1, 2, 3], [4, 5, 6]]
deep = copy.deepcopy(original)

deep[0][0] = 999
print(original[0][0])  # 1 — оригинал не изменился

Способы поверхностного копирования:

# Для списков
lst = [1, 2, 3]
copy1 = lst.copy()
copy2 = lst[:]
copy3 = list(lst)

# Для словарей
d = {"a": 1}
copy4 = d.copy()
copy5 = dict(d)

# Универсальный
import copy
copy6 = copy.copy(lst)

Когда что использовать:

  • Поверхностное — когда коллекция содержит только неизменяемые элементы (числа, строки).
  • Глубокое — когда есть вложенные изменяемые объекты (списки в списках, словари в списках).
# Поверхностного достаточно
nums = [1, 2, 3]  # Элементы — неизменяемые int
safe_copy = nums.copy()

# Нужно глубокое
matrix = [[1, 2], [3, 4]]  # Вложенные списки
safe_copy = copy.deepcopy(matrix)