← Все вопросы

Чем deepcopy отличается от обычного copy?

Задан 15 месяцев назад1.2к просмотров3 ответа
16

Скопировал вложенный список через copy(), поменял внутренний список — и в копии тоже поменялось. Почему? В чём разница между copy.copy и copy.deepcopy?

3 ответа

27
✓ Принятый ответ — помог автору

Разница в глубине копирования вложенных объектов.

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 нужен именно для вложенных структур (списки списков, списки словарей и т.п.).

Рустам Закиров deepcopy ещё и заметно медленнее, не лепи его везде подряд · 15 месяцев назад
Александр Первый вот оно что, внешний новый а внутренние общие. спасибо, неделю мучился · 15 месяцев назад
10

copy копирует только верхний уровень, вложенные объекты остаются общими. deepcopy копирует всё насквозь.

4

Тебе нужен copy.deepcopy.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект