Добавить в корзинуПозвонить
Найти в Дзене
Креативный дизайн

Искусство копирования в Python: Как избежать изменений в копиях

Работа с копиями объектов в Python — задача, часто требующая особого внимания от программистов. Особенно это касается изменяемых объектов, таких как списки (list) и словари (dict). Как избежать ненужных изменений в копиях, сохраняя оригинальные данные нетронутыми? Давайте разберёмся в этом вопросе. Когда вы создаёте копию объекта с помощью метода copy(), вы получаете так называемую {\em поверхностную копию}. Это означает, что на первом уровне копия независима от оригинала, но если внутри объекта имеются ссылки на другие сложные объекты, они будут общими для оригинала и копии. import copy
original = {'key1': [1, 2, 3], 'key2': 'value2'}
shallow_copy = copy.copy(original)
shallow_copy['key1'].append(4) # Изменяем вложенный список
print(original) # Выведет {'key1': [1, 2, 3, 4], 'key2': 'value2'} Если у словаря есть вложенные словари (например, вложенные списки []), то ссылки на них сохраняются. То есть копии первого уровня дают копию первого уровня, а вложенные копии второго уровня
Оглавление

Работа с копиями объектов в Python — задача, часто требующая особого внимания от программистов. Особенно это касается изменяемых объектов, таких как списки (list) и словари (dict). Как избежать ненужных изменений в копиях, сохраняя оригинальные данные нетронутыми? Давайте разберёмся в этом вопросе.

Поверхностное копирование: метод copy

Когда вы создаёте копию объекта с помощью метода copy(), вы получаете так называемую {\em поверхностную копию}. Это означает, что на первом уровне копия независима от оригинала, но если внутри объекта имеются ссылки на другие сложные объекты, они будут общими для оригинала и копии.

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

import copy

original = {'key1': [1, 2, 3], 'key2': 'value2'}
shallow_copy = copy.copy(original)

shallow_copy['key1'].append(4)
# Изменяем вложенный список

print(original)
# Выведет {'key1': [1, 2, 3, 4], 'key2': 'value2'}

Расшифровка кода:

  1. Импортирует модуль copy, чтобы использовать функцию copy().
  2. Создаёт словарь original с вложенным изменяемым объектом (список).
  3. Делает поверхностную копию словаря original, создавая объект shallow_copy.
  4. Добавляет элемент в список внутри shallow_copy['key1'].
  5. Печатает оригинальный словарь, показывая, что список внутри него также был изменён.

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

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

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

Например:

numbers = (1, 2, 3)
copy_numbers = copy.copy(numbers)

Здесь copy_numbers получит полностью независимую версию numbers, так как кортежи неизменяемы.

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

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

Глубокое копирование: метод deepcopy

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

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

Можно использовать глубокую (полную) копию объекта deepcopy, используя встроенную в Python модуль copy. И из встроенного модуля copy необходимо в таком случае импортировать функцию deepcopy. И функция deepcopy вернёт нам полностью новый объект со всеми новыми внутренними ссылками. Оригинальный объект при этом не изменяется.

То есть при использовании deepcopy, если у словаря есть вложенные словари, то ссылки на них не сохраняются.

Пример глубокого копирования

import copy

original = {'key1': [1, 2, 3], 'key2': 'value2'}
deep_copy = copy.deepcopy(original)

deep_copy['key1'].append(4)
# Изменяем вложенный список

print(original)
# Выведет {'key1': [1, 2, 3], 'key2': 'value2'}

Разбор строк кода:

  1. Импортирует модуль copy, чтобы использовать функцию deepcopy().
  2. Создаёт словарь original с вложенным изменяемым объектом (список).
  3. Делает глубокую копию словаря, создавая объект deep_copy.
  4. Добавляет элемент в список внутри deep_copy['key1'].
  5. Печатает оригинальный словарь, показывая, что он остался без изменений.

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

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

Заключение

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

Полезные ресурсы:

Креативный дизайн | Дзен

Сообщество дизайнеров в VK

https://vk.com/grafantonkozlov

Телеграмм канал сообщества

https://t.me/grafantonkozlov

Архив эксклюзивного контента

https://boosty.to/antonkzv

Канал на Дзен

https://dzen.ru/grafantonkozlov

---------------------------------------

Бесплатный Хостинг и доменное имя

https://tilda.cc/?r=4159746

Мощная и надежная нейронная сеть Gerwin AI

https://t.me/GerwinPromoBot?start=referrer_3CKSERJX

GPTs — плагины и ассистенты для ChatGPT на русском языке

https://gptunnel.ru/?ref=Anton

---------------------------------------

Донат для автора блога

dzen.ru/grafantonkozlov?donate=true