Срез списка в Python создает поверхностную или глубокую копию?

Ответ

Срез списка в Python (например, new_list = old_list[:]) создает поверхностную (shallow) копию.

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

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

Пример:

import copy

original_list = [[1, 2], [3, 4]]

# 1. Поверхностная копия (shallow copy) с помощью среза
shallow_copy = original_list[:]

# Изменяем вложенный список через поверхностную копию
shallow_copy[0][0] = 999

# Изменение отразилось и в оригинале, т.к. вложенный список - общий объект
print(f"Оригинал после shallow copy: {original_list}") # [[999, 2], [3, 4]]
print(f"Shallow copy:              {shallow_copy}")    # [[999, 2], [3, 4]]

# 2. Глубокая копия (deep copy) для сравнения
deep_copy = copy.deepcopy(original_list)

# Изменяем вложенный список через глубокую копию
deep_copy[0][1] = 777

# Изменение НЕ отразилось в оригинале, т.к. все объекты рекурсивно скопированы
print(f"Оригинал после deep copy:   {original_list}") # [[999, 2], [3, 4]]
print(f"Deep copy:                 {deep_copy}")    # [[999, 777], [3, 4]]

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