Рубрики
Без рубрики

Python Copy – Выполнение глубокого и неглубокого копирования

В этой статье мы рассмотрим использование модуля копирования Python для выполнения операций глубокого и неглубокого копирования.

Автор оригинала: Pankaj Kumar.

В этой статье мы рассмотрим использование модуля Python Copy для выполнения операций глубокого и неглубокого копирования.

Итак, что мы подразумеваем под глубоким копированием и поверхностным копированием?

Давайте посмотрим, используя наглядные примеры!

Зачем нам нужен модуль копирования Python?

В Python все представлено с помощью объектов. Поэтому во многих случаях нам может потребоваться прямое копирование объектов.

В этих случаях мы не можем использовать оператор присваивания напрямую.

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

Следующий пример иллюстрирует эту проблему с использованием изменяемого объекта общего списка.

a = [1, 2, 3, 4]

b = a

print(a)
print(b)

b.append(5)

# Changes will be reflected in a too!
print(a)
print(b)

Выход

[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

Как видите, поскольку обе переменные указывают на один и тот же объект, при изменении b изменяется и a !

Чтобы справиться с этой проблемой, Python дает нам способ использовать модуль Copy .

Модуль копирования Python является частью стандартной библиотеки и может быть импортирован с помощью приведенной ниже инструкции:

import copy

Теперь в этом модуле мы можем выполнять в основном два типа операций:

  • Мелкая Копия
  • Глубокое Копирование

Давайте теперь рассмотрим эти методы.

Мелкая Копия

Этот метод используется для выполнения операции неглубокого копирования.

Синтаксис для вызова этого метода:

import copy

new_obj = copy.copy(old_obj) # Perform a shallow copy

Это сделает две вещи –

  • Создание нового объекта
  • Вставить все ссылки на объекты, найденные в исходном объекте

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

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

Чтобы понять это, давайте возьмем пример.

Чтобы проиллюстрировать первый пункт, мы попробуем сделать это с помощью простого списка целых чисел (без вложенных объектов!)

import copy

old_list = [1, 2, 3]

print(old_list)

new_list = copy.copy(old_list)

# Let's try changing new_list
new_list.append(4)

# Changes will not be reflected in the original list, since the objects are different
print(old_list)
print(new_list)

Выход

[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3]

Как вы можете видеть, в случае, если наш объект представляет собой простой список, нет никаких проблем с неглубоким копированием.

Возьмем другой случай, когда наш объект-это список списков.

import copy

old_list = [[1, 2], [1, 2, 3]]

print(old_list)

new_list = copy.copy(old_list)

# Let's try changing a nested object inside the list
new_list[1].append(4)

# Changes will be reflected in the original list, since the object contains a nested object
print(old_list)
print(new_list)

Выход

[[1, 2], [1, 2, 3]]
[[1, 2], [1, 2, 3, 4]]
[[1, 2], [1, 2, 3, 4]]

Здесь обратите внимание, что оба old_list и new_list были затронуты!

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

Это называется операцией Deep Copy с использованием модуля копирования Python.

Глубокое Копирование

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

Для выполнения операции глубокого копирования мы можем использовать следующий синтаксис:

import copy

new_object = copy.deepcopy(old_object)

Давайте возьмем наш старый пример и попробуем использовать глубокое копирование для решения нашей проблемы.

import copy

old_list = [[1, 2], [1, 2, 3]]

print(old_list)

new_list = copy.deepcopy(old_list)

# Let's try changing a nested object inside the list
new_list[1].append(4)

# Changes will be reflected in the original list, since the objects are different
print(old_list)
print(new_list)

Выход

[[1, 2], [1, 2, 3]]
[[1, 2], [1, 2, 3]]
[[1, 2], [1, 2, 3, 4]]

Обратите внимание, что старый список не изменился. Поскольку все объекты были скопированы рекурсивно, теперь нет никаких проблем!

Однако из-за копирования всех объектов этот метод deepcopy немного дороже по сравнению с методом неглубокого копирования.

Так что используйте это с умом, только когда вам это нужно!

Вывод

В этой статье мы узнали об использовании модуля копирования Python для выполнения операций неглубокого копирования и глубокого копирования.

Рекомендации