← Назад к вопросам

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

1.0 Junior🔥 111 комментариев
#Python

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое поверхностное копирование (Shallow Copy) в Python?

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

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

В Python поверхностное копирование можно выполнить несколькими способами:

  1. Через модуль copy с функцией copy.copy().
  2. Для списков — с помощью слайса [:] или метода .copy().
  3. Для словарей — с помощью метода .copy() или конструктора dict().

Рассмотрим на примере со вложенными списками:

import copy

# Исходный список с вложенным списком
original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)  # Поверхностное копирование

# Изменяем элемент верхнего уровня в копии
shallow_copied_list[0] = 100
print(f"Original list: {original_list}")         # [1, 2, [3, 4]]
print(f"Shallow copy: {shallow_copied_list}")    # [100, 2, [3, 4]]
# Верхний уровень изменился только в копии

# Теперь изменяем вложенный список в копии
shallow_copied_list[2].append(5)
print(f"Original list after nested change: {original_list}")    # [1, 2, [3, 4, 5]]
print(f"Shallow copy after nested change: {shallow_copied_list}")  # [100, 2, [3, 4, 5]]
# Оба списка изменились, так как вложенный список — один и тот же объект

Когда использовать поверхностное копирование?

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

Различия между поверхностным и глубоким копированием

  • Поверхностное копирование (copy.copy()):

    • Копирует только первый уровень.
    • Вложенные изменяемые объекты остаются общими.
    • Быстрее и требует меньше памяти.
  • Глубокое копирование (copy.deepcopy()):

    • Рекурсивно копирует все вложенные объекты.
    • Создаёт полностью независимую копию всей структуры.
    • Медленнее и может вызвать проблемы с циклическими ссылками.

Практические рекомендации для QA Automation

В автоматизированном тестировании понимание поверхностного копирования критически важно для:

  • Изоляции тестовых данных: непреднамеренное изменение общих данных между тестами может привести к ложным срабатываниям.
  • Работы с фикстурами: при подготовке тестовых данных нужно создавать независимые копии, если данные модифицируются в тестах.
  • Параметризации тестов: когда тестовые данные включают сложные структуры, важно правильно их копировать перед модификацией.
# Пример проблемы в тестах
test_data = {"input": [1, 2, [3, 4]], "expected": 10}

def modify_data(data):
    data["input"][2].append(5)  # Модифицирует исходные данные!

# Поверхностная копия не поможет с вложенным списком
test_data_copy = test_data.copy()
modify_data(test_data_copy)
print(test_data)  # {'input': [1, 2, [3, 4, 5]], 'expected': 10} - ИСХОДНЫЕ ДАННЫЕ ИЗМЕНИЛИСЬ!

# Правильное решение — глубокое копирование
import copy
test_data_deepcopy = copy.deepcopy(test_data)

Вывод

Поверхностное копирование — это эффективный механизм для создания копий объектов, который работает на уровне ссылок. Для QA-инженеров важно понимать его ограничения и использовать глубокое копирование там, где требуется полная изоляция тестовых данных. Выбор между поверхностным и глубоким копированием зависит от структуры данных и требований к их независимости в тестовых сценариях.

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