Для списков и для большинства типов последовательностей извлечение фрагментов делает неглубокую копию фрагмента списка.В xs = bs[:]
xs
становится копией bs
Срез Назначение , с другой стороны, не делает копию нарезанного фрагмента.В bs[:] = [4, 5, 6]
ни одна из частей bs
не создается.Содержимое [4, 5, 6]
присваивается непосредственно в bs
.(Это содержимое является ссылками на объекты int, а ссылки - это то, что копируется - мы не изменяем целые числа.)
В цепочечном присваивании xs = bs[:] = [4, 5, 6]
значение, присвоенное xs
это список, созданный выражением [4, 5, 6]
справа, а не фрагментом bs
.Назначение выполняется как
temp = [4, 5, 6]
xs = temp
bs[:] = temp
, а не
bs[:] = [4, 5, 6]
xs = bs[:]
Не выполняется извлечение фрагмента, и не создаются копии bs
.
Я не знаю ни одного типа в ядре языка Python, стандартной библиотеке Python или какой-либо широко используемой сторонней библиотеке, где срез выполняет глубокое копирование.Некоторые типы, такие как viewviews и массивы NumPy, возвращают представление данных исходного объекта для извлечения фрагмента, но это даже меньше копии, чем мелкой копии.