Чем deepcopy отличается от обычного copy?
Скопировал вложенный список через copy(), поменял внутренний список — и в копии тоже поменялось. Почему? В чём разница между copy.copy и copy.deepcopy?
3 ответа
Разница в глубине копирования вложенных объектов.
copy.copy (поверхностная копия) создаёт новый внешний контейнер, но внутренние объекты те же самые — копируются только ссылки на них. Поэтому, меняя вложенный список, ты меняешь его в обеих «копиях».
copy.deepcopy рекурсивно копирует всё вглубь — получаются полностью независимые объекты.
import copy
a = [[1, 2], [3, 4]]
shallow = copy.copy(a)
shallow[0].append(99)
print(a) # [[1, 2, 99], [3, 4]] — внутренний список общий!
deep = copy.deepcopy(a)
deep[0].append(0)
print(a) # не изменился, deep полностью независим
Для плоского списка из чисел/строк разницы нет — там хватает и a.copy()/a[:]. deepcopy нужен именно для вложенных структур (списки списков, списки словарей и т.п.).
copy копирует только верхний уровень, вложенные объекты остаются общими. deepcopy копирует всё насквозь.
Тебе нужен copy.deepcopy.