Что вам нужно знать о поверхностном и глубоком копировании в Python

Иногда вам понадобится полностью скопировать объект, но иногда вам захочется использовать его в качестве ссылки. В настоящее время при программировании на Python вам понадобятся Shallow и Deep Copy.

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 1.

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

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

Используйте мелкую копию

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

Чтобы реализовать поверхностное копирование в Python, вы можете использовать функцию copy() модуля копирования или метод .copy() объекта.

Давайте рассмотрим пример работы со списком словарей в Python.

импортировать копию main_list = (29, 49, (“Q”, “R”)) small_copy = copy.copy(main_list) # Содержимое файла неглубокой копии(2)(0) = 99 main_list(2)(1) = 100 print(f”Основной список: {main_list}”) print(f”Неглубокий список копирования: {shallow_copy}”)

В приведенном выше коде переменная main_list содержит список целых чисел и вложенный список (вложенный объект), содержащий буквы. Функция копирования создает копию main_list, где код содержит еще одну переменную, small_copy.

Любые изменения, которые вы вносите во вложенный список small_copy, напрямую влияют на main_list. Эти изменения указывают на то, что вложенный или внутренний список small_copy является всего лишь ссылкой на main_list, поэтому изменения применяются. используется в main_list .

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 2.

Между тем, любые изменения, внесенные во внешние (целочисленные) элементы в small_copy или main_list, будут влиять только на эту версию. Внешние элементы сами по себе являются независимыми значениями, а не просто ссылками.

импортировать копию main_list = (29, 49, (“Q”, “R”)) small_copy = copy.copy(main_list) # Для этого необходимо использовать small_copy(0) = “M” main_list(1) = “N” print(f”Основной список: {main_list}”) print(f”Неполный список копирования: {shallow_copy}”)

Этот результат доказывает, что оба внешних элемента списка независимы друг от друга:

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 3.

Та же идея применима и при работе со словарями.

dict1 = {‘ten’: 10, ‘twenty’: 20, ‘double’:{‘thirty’: 30, ‘sixty’: 60}} dict2 = dict1.copy()# ngoài dict1(‘double’)(‘thirty’) = 30.00 dict1(‘ten’) = 10.00 print(f”Основной словарь, {dict1}”) print(f”Неглубокий словарь копирования, {dict2}”)

Изменения, внесенные во вложенный словарь dict1, влияют как на dict1, так и на dict2. Между тем, изменения элементов за пределами dict1 влияют только на него.

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 4.

Используйте глубокое копирование

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

Чтобы создать глубокую копию в Python, используйте функцию deepcopy() модуля копирования.

Рассмотрим пример работы со списком:

import copy main_list = (200, 300, (“I”, “J”)) deep_copy = copy.deepcopy(main_list) # Если вы хотите, чтобы это произошло, то deep_copy(2)(0) = “K” main_list( 0) = 500 print(f”Основной список: {main_list}”) print(f”Список глубокого копирования: {deep_copy}”)

Здесь код реализует глубокую копию main_list, создавая независимую копию с именем deep_copy.

При редактировании вложенных списков или внешних элементов в deep_copy ваши изменения не влияют на исходный список и наоборот. Это указывает на то, что вложенный список или внешние элементы не являются общими для двух копий.

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 5.

Работа с пользовательскими объектами

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

Вот пример того, как создать простой объект из класса Book:

class Book: def __init__(self, title,authors,price): self.title = название self.authors = авторы self.price = цена def __str__(self): return f”Book(title=”{self.title}” , автор=”{self.authors}”, цена=”{self.price}”)”

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

import copy # Tạo đối tượng Book book1 = Book(“Как использовать неглубокую копию”, (“Бобби Джек”, “Принсвилл Иньян”), 1000) # Tạo một неглубокая копия book2 = copy.copy(book1) # Chỉnh sửa đối tượng gốc book1.authors.append(“Юврадж Чандра”) book1.price = 50 # Kiểm tra đối tượng print(book1) print(book2)

Как видите, поверхностная копия (book2) — это новый объект, но она ссылается на тот же внутренний объект (список авторов), что и исходный объект (book1). Таким образом, изменение корневых авторов влияет на оба экземпляра (book1 и book2), тогда как изменение внешнего элемента (price) влияет только на корневой объект (book1).

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

# Tạo đối tượng Book book1 = Book(“Why MakeUseOf Deep Copy?”, (“Бобби Джек”, “Юврадж Чандра”), 5000) # Tạo một deep copy book2 = copy.deepcopy(book1) # Chỉnh sửa đối tượng gốc book1.authors.append(“Принцвилл Иньян”) book1.price = 60 # Kiểm tra các đối tượng print(book1) print(book2)

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

Что нужно знать о поверхностном и глубоком копировании в Python. Рисунок 6.

Варианты использования поверхностного и глубокого копирования

  1. Используйте поверхностное копирование, если вы хотите скопировать сложный объект без создания новых экземпляров вложенного объекта. Этот метод экономит память и работает быстрее, чем глубокое копирование, поскольку он не копирует вложенные объекты.
  2. Используйте поверхностное копирование, чтобы создать снимок состояния объекта, сохраняя при этом общий доступ к некоторым базовым данным между исходным и скопированным объектом.
  3. Используйте глубокую копию, если хотите редактировать копию объекта, не затрагивая исходный объект. При этом создаются независимые копии вложенных объектов, гарантируя, что любые изменения в копии не будут применены к исходному объекту.
  4. Глубокое копирование важно, когда вам нужны независимые копии вложенных структур данных, главным образом при работе с рекурсивными или сложными иерархиями объектов.

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

В приведенной выше статье вы познакомились с «Что нужно знать о поверхностном и глубоком копировании в Python». СоветыНадейтесь, что эта статья вам поможет! Если эта статья кажется вам интересной и полезной, не забудьте поделиться ею. Спасибо!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *