При работе со списками или другими изменяемыми объектами может потребоваться создание копий этих объектов.

В Python обычной практикой является использование оператора «=» для создания копий новых объектов.

Но полезно знать, что операторы присваивания в Python не создают копии объектов, они только привязывают имена к объекту. Когда мы используем оператор присваивания, мы можем подумать, что он создаст новый объект, но это не так. Он только создает новую переменную, которая показывает ссылку на объект.

Рассмотрим следующий пример:

Мы скопировали список1 в список2. Давайте проверим их идентификатор и посмотрим, что произойдет:

Встроенная функция id() возвращает идентификатор объекта в виде целого числа. Это целое число показывает расположение объектов в памяти. Когда мы скопировали список1 в список2, мы просто создали новый объект (список2) и заполнили его ссылкой на другой объект (список1). Это известно как поверхностное копирование. Это всего один уровень глубины, и оба списка имеют одни и те же дочерние объекты.

Если мы добавим дочерний элемент в список1, список2 останется неизменным, если указанные дочерние элементы не будут изменены.

List2 остается неизменным, так как дочерние объекты, на которые ссылаются, не были затронуты. Посмотрите, что произойдет, когда мы изменим исходные дочерние объекты:

List2 также был изменен, потому что мы сделали только неглубокую копию исходного списка. Для полностью независимых копий вам придется создать глубокую копию списка.

Создание глубоких копий

Стандартная библиотека Python имеет встроенный модуль копирования, который можно использовать для создания поверхностных и глубоких копий. Мы будем использовать его для создания глубокой копии, как показано ниже:

Теперь, когда мы меняем первый список, второй не затрагивается, так как он полностью независим. Вы также можете создавать поверхностные копии с помощью copy.copy(), это полезно, особенно когда вы хотите показать, что создаете поверхностную копию.

Очки, чтобы помнить

  • Неглубокая копия только создает новый объект, а затем вставляет в него ссылки на дочерние объекты в исходном объекте.
  • Глубокая копия – это новый составной объект, который полностью независим от оригинала и содержит рекурсивно вставленные копии дочерних объектов, найденных в исходном объекте.

Тем не менее, вы также можете использовать модуль python для клонирования произвольных объектов, таких как пользовательские классы. Я бы рекомендовал эту книгу для получения дополнительной информации.

Спасибо за чтение!