Модуль copy. Функции copy.copy и copy.deepcopy
Создать копию объекта можно при помощи 2 способов, использовать
срез [:], или метод .copy() методы работают по разному, но
эффект от них одинаков, и по времени исполнения они действуют
одинаково.
Копирование может происходить 2 способами, при помощи обычного
метода obj.copy() который есть у всех структур данных, так и
при помощи спец модуля copy у которого есть спец метод
copy.copy(obj) оба метода работают одинаково, их способ копирования
называется shallow copy
2 метода копирования shallow copy и deep copy
Когда происходит обычное копирование структуры, то копирование
происходит способом shallow copy этот метод копирует только
верхний слой, то есть только самую первую вложенность, но если в
структуре есть вложенная структура, то ссылка на нее остается
старой.
Вот пример:
import copy
print('Использование обычного copy:')
my_list_1 = [1, 2, 3, 4, 5, [1,2,3]]
# my_list_2 = my_list_1.copy()
my_list_2 = copy.copy(my_list_1)
print('До изменения')
print(f'my_list_1 : {my_list_1}')
print(f'my_list_2 : {my_list_2}')
print('\nИзменение')
print('my_list_2[0] = 555')
print('my_list_2[5][0] = 777\n')
my_list_2[0] = 555
my_list_2[5][0] = 777
print('\nПосле изменения')
print(f'my_list_1 : {my_list_1}')
print(f'my_list_2 : {my_list_2}')
# Вывод
# Использование обычного copy:
# До изменения
# my_list_1 : [1, 2, 3, 4, 5, [1, 2, 3]]
# my_list_2 : [1, 2, 3, 4, 5, [1, 2, 3]]
# Изменение
# my_list_2[0] = 555
# my_list_2[5][0] = 777
# После изменения
# my_list_1 : [1, 2, 3, 4, 5, [777, 2, 3]]
# my_list_2 : [555, 2, 3, 4, 5, [777, 2, 3]]Как можно увидеть из примера, изменение верхнего слоя в новом списке не привел к изменению в другом списке, но изменение во вложенном списке, привело к изменению в обоих списках, то есть полностью скопирован только верхний слой, в то время как внутренний слой в обоих списках имеет одинаковую ссылку на один и тот же обьект.
Чтобы сделать полную копию всех обьектов структуры со всей степенью
вложенности, следует использовать метод deepcopy модуля copy
Модуль copy
Предоставляет 2 метода для копирования:
copy.copy(obj)- поверхностное копирование.copy.deepcopy(obj)- глубокое рекурсивное копирование со всей степенью вложенности.