Короткий ответ
Мелкое копирование создаёт новый объект верхнего уровня, но не копирует вложенные объекты: их изменения видны в оригинале. Глубокое копирование рекурсивно дублирует все вложенные объекты и даёт полностью независимую копию. А простое присваивание копией не является вовсе — оно лишь добавляет ссылку.
Как это работает подробнее
Разница проявляется при работе с вложенными структурами: списками списков, словарями со списками и объектами, содержащими другие объекты.
- Присваивание. Запись
b = aне создаёт копию: обе переменные ссылаются на один и тот же объект, поэтому изменения видны через обе. - Мелкая копия. Функция
copy.copy()создаёт новый объект верхнего уровня, но копирует только ссылки на вложенные объекты, которые остаются разделяемыми. - Глубокая копия. Функция
copy.deepcopy()рекурсивно дублирует вложенные объекты, создавая полностью независимую структуру. - Плоские структуры. Для структур только из неизменяемых значений мелкая и глубокая копия ведут себя практически одинаково.
Пример кода
Мелкая и глубокая копия
import copy
original = [[1, 2], [3, 4]]
shallow = copy.copy(original) # мелкая копия
shallow[0][0] = 99
print(original) # [[99, 2], [3, 4]] — оригинал изменился
deep = copy.deepcopy(original) # глубокая копия
deep[0][0] = 100
print(original) # [[99, 2], [3, 4]] — не изменилсяЧто использовать на практике
- Мелкая копия. Метод
copy()у списков и словарей выполняет мелкое копирование и подходит для плоских структур. - Вложенные данные. Если структура вложенная и её нужно менять независимо, применяй
copy.deepcopy().