Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: shallow copy, deep copy, Python objects, mutable objects, nested structures

Почему copy не всегда решает проблему копирования объектов?

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

Короткий ответ

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

Длинный ответ

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

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

Поверхностное копирование создаёт новый объект-контейнер, но затем помещает в него ссылки на объекты, которые находились в исходном контейнере. Для неизменяемых (immutable) типов, таких как числа, строки или кортежи, это не проблема, так как их нельзя изменить. Проблема возникает с изменяемыми (mutable) объектами, которые находятся внутри копируемого контейнера.

Пример проблемы

Рассмотрим список, содержащий другие списки (вложенную структуру).

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow_copy = original.copy()  # или copy.copy(original)

# Изменяем вложенный список в копии
shallow_copy[0][0] = 99

print("Оригинал:", original)       # [[99, 2, 3], [4, 5, 6]]
print("Копия:", shallow_copy)      # [[99, 2, 3], [4, 5, 6]]
# Изменение затронуло оба списка!

Как видно, изменение элемента во вложенном списке копии привело к изменению исходного списка. Это происходит потому, что original[0] и shallow_copy[0] — это одна и та же ссылка на список [1, 2, 3].

Решение: Глубокое копирование

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

deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 100

print("Оригинал после deepcopy:", original)  # [[99, 2, 3], [4, 5, 6]]
print("Глубокая копия:", deep_copy)          # [[100, 2, 3], [4, 5, 6]]
# Оригинал остался неизменным.

Где это применяется?

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

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Python

    Python

Ключевые слова

#shallow copy

#deep copy

#Python objects

#mutable objects

#nested structures

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.