Перевод статьи Python Shallow Copy and Deep Copy.
Копирование объектов в Python
Оператор присваивания =
не создаёт копию объекта. Присваивание создаёт новую переменную которая дублирует ссылку на исходный объект.
Рассмотрим пример
1 2 3 4 5 6 7 8 9 10 |
old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']] new_list = old_list new_list[2][2] = 9 print('Old List:', old_list) print('ID of Old List:', id(old_list)) print('New List:', new_list) print('ID of New List:', id(new_list)) |
После запуска программа выдаст следующее:
1 2 3 4 5 |
Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 140673303268168 |
Обе переменные ссылаются на один объект, это подтверждает одинаковый идентификатор объекта 140673303268168. Так что при изменении значений в переменных new_list
и old_list
, изменение будет видно в обоих переменных.
Иногда нужно оставить исходное значение без изменений и модифицировать только новое. В Python, есть два способа сделать копию: поверхностное копирование и глубокое копирование.