Глава 11 · Очень много информации!
Копирование списков
Скопировать внешний список легко — а вот вложенные списки внутри него по умолчанию остаются общими. Разберём, почему и что с этим делать.
Три безопасных способа скопировать список
sposoby_kopirovaniya.py
original = [1, 2, 3]
kopiya_1 = original.copy()
kopiya_2 = list(original)
kopiya_3 = original[:]
kopiya_1.append(4)
print(original) # [1, 2, 3] — не изменился
print(kopiya_1) # [1, 2, 3, 4]
Все три способа создают новый ВНЕШНИЙ список. Но что, если элементы сами являются списками?
Поверхностная копия (shallow copy) — важный нюанс
shallow_copy_trap.py
original = [["Anna", 10], ["Bob", 20]]
kopiya = original.copy()
kopiya[0][1] = 999
print(original) # [['Anna', 999], ['Bob', 20]] — тоже изменился!
.copy() копирует только один уровень вложенности
.copy() (и list(...), и срез [:]) создают новый внешний список, но не копируют вложенные списки внутри него — они остаются общими. Это и называется поверхностной копией (shallow copy). Изменение вложенного списка через копию видно и в оригинале.copy.deepcopy() — когда нужна полностью независимая копия
deepcopy.py
import copy
original = [["Anna", 10], ["Bob", 20]]
polnaya_kopiya = copy.deepcopy(original)
polnaya_kopiya[0][1] = 999
print(original) # [['Anna', 10], ['Bob', 20]] — не изменился
deepcopy — не всегда правильный ответ по умолчанию
copy.deepcopy() рекурсивно пытается скопировать всю вложенную структуру целиком. Это решает проблему выше, но для больших или сложных структур глубокое копирование может быть заметно медленнее и не всегда нужно — часто достаточно скопировать только тот уровень, который реально будет меняться.Практика: копирование списков и поверхностная копия
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки