скопировать в Python (глубокое копирование и поверхностное копирование)

| | | | | | | | | | | |

Иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую. В Python есть два способа создания копий:

  • Глубокое копирование
  • Поверхностное копирование

Чтобы сделать эти копии, мы используем скопировать модуль . Мы используем модуль copy для поверхностных и глубоких операций копирования. Например


# import copy module

import копировать


# инициализировать список 1

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


# использовать копию для поверхностного копирования

li2 = co py.copy ( li1)


# использование Deepcopy для Deepcopy

li3 < /код> <класс кода = "ке yword"> = copy.deepcopy (li1)

В приведенном выше коде copy() возвращает поверхностную копию списка, а deepcopy() возвращает полную копию списка.

deepcopy

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


# Код Python для демонстрации операций копирования


# import & quot; копировать " для операций копирования

import copy


# инициализация списка 1

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


# использование Deepcopy для глубокого копирования

li2 = copy.deepcopy (li1)


# исходные элементы списка

print ( "Исходные элементы перед глубоким копированием" )

for i in range ( 0 , len (li1)):

print (li1 [i], end = " " )

print ( " " )


# добавить элемент в новый список

li2 [ 2 ] [ 0 ] = 7


# Изменение отражено в l2

print ( "Новый список элементов после глубокого копирования" )

для i в диапазон ( 0 , len (li1)):

print (li2 [i], end = "" )


p rint ( "" )


# Изменение НЕ отражается в исходном списке
# как глубокая копия

print ( "Исходные элементы после глубокого копирования" )

for i in диапазон ( 0 , len (li1)):

print (li1 [i], end = "" )

Выход:

Исходный элемент s до глубокого копирования 1 2 [3, 5] 4 Новый список элементов после глубокого копирования 1 2 [7, 5] 4 Исходные элементы после глубокого копирования 1 2 [3, 5] 4 

In В приведенном выше примере изменение, внесенное в список, не повлияло на другие списки, что указывает на глубокое копирование списка.

Поверхностное копирование

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


# Код Python для демонстрации операций копирования


#импорт" копировать " для операций копирования

import copy


# инициализация списка 1

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


# использовать копию для поверхностного копирования

li2 = copy.copy (li1)


# элементы исходного списка

print ( " Исходные элементы перед поверхностным копированием " )

для i in range ( 0 , len (li1)):

print (li1 [i], end = "" )


print ( "" )


# добавить элемент в новый список

li2 [ 2 ] [ 0 ] = 7


# проверить, отражено ли изменение

print ( "Исходные элементы после поверхностного копирования" )

for i in range ( 0 , len (li1 )):

print (li1 [i], end = " " )

Выход:

Исходные элементы перед поверхностным копированием 1 2 [3, 5] 4 Исходные элементы после поверхностного копирования 1 2 [7, 5] 4 

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

Важные моменты:
Разница между мелкими и глубокими копиями применима только к составным объектам (объектам, содержащим другие объекты, такие как списки или экземпляры классов):

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