Глава 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]] — тоже изменился!
originalkopiya = original.copy()[0][0]["Anna", 10][1][1]["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, без установки
Открыть практику →