Ответ
Срез списка в 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()
.