Python deepcopy: what it is and how to use it
Python deepcopy позволяет создавать копию объекта с тем же значением, но с другими ссылками на области памяти. Таким образом, изменение копии не повлияет на исходный объект.
При работе с объектами, которые содержат вложенные объекты, относящиеся к различным классам, может возникнуть необходимость выполнять глубокое копирование (deep copy).
Рассмотрим следующий пример:
import copy
# Создаем простой список
data = [1, 2, [3, 4]]
# Копируем список
new_data = copy.copy(data)
# Меняем вложенный элемент
new_data[2][0] = 5
# Выводим полученные значения
print(data)
print(new_data)
Результат будет:
[1, 2, [5, 4]]
[1, 2, [5, 4]]
Как можно видеть, при изменении вложенного элемента в копии (new_data), значение этого элемента изменяется и в исходном объекте (data). Это происходит потому, что при осуществлении поверхностного копирования создается новый объект, но вложенные объекты в нем остаются ссылками на те же самые области памяти, что и в исходном объекте.
Для решения этой проблемы используется deepcopy, который выполняет глубокую копию. В этом случае каждый вложенный объект также копируется с использованием deepcopy:
import copy
# Создаем список с вложенным списком
data = [1, 2, [3, 4]]
# Создаем глубокую копию
new_data = copy.deepcopy(data)
# Меняем значение вложенного элемента
new_data[2][0] = 5
# Выводим полученные значения
print(data)
print(new_data)
Результат:
[1, 2, [3, 4]]
[1, 2, [5, 4]]
Теперь при изменении вложенного элемента в копии (new_data) значение этого элемента не изменяется в исходном объекте (data).
Таким образом, deepcopy позволяет создавать глубокую копию объекта со всеми вложенными объектами и предотвращать получение неожиданных результатов при работе с этими объектами.