python切片赋值是原地修改可变序列的动态长度替换操作,先删除原切片元素,再插入右侧可迭代对象各元素;仅支持步长为1的切片,不适用于不可变类型。

Python切片赋值不是简单地“取一部分再赋值”,而是一种原地修改列表(或其他可变序列)的特殊操作,它会根据右侧表达式的长度,自动删除、插入或替换左侧切片对应位置的元素。
切片赋值的本质:动态长度替换
普通切片(如 a[1:3])返回一个新列表;而切片赋值(如 a[1:3] = [x, y])直接在原列表上操作,且左右两侧长度无需相等。Python 会先删除原切片覆盖的元素,再把右侧可迭代对象的每个元素按顺序插入该位置。
-
右侧比左侧长:相当于“插入”——原位置被扩展,后续元素后移
例:a = [1, 2, 3]; a[1:2] = ['x', 'y', 'z']→[1, 'x', 'y', 'z', 3] -
右侧比左侧短:相当于“删除+替换”——原位置被压缩,后续元素前移
例:a = [1, 2, 3, 4]; a[1:3] = ['X']→[1, 'X', 4] -
右侧为空(如
[]或iter([])):纯删除
例:a = [1, 2, 3]; a[1:3] = []→[1]
只能用于可变序列,且右侧必须是可迭代对象
切片赋值要求目标对象支持 __setitem__ 且为可变类型(如 list),元组、字符串等不可变类型不支持。右侧可以是任意可迭代对象(列表、元组、生成器、range 等),不必是列表。
- ✅ 正确:
a = [1, 2, 3]; a[0:1] = (9,); a[1:] = range(5) - ❌ 报错:
t = (1, 2, 3); t[0:1] = [9](元组不可变)
TypeError: 'tuple' object does not support item assignment - ❌ 报错:
a[0:1] = 9(整数不可迭代)
TypeError: can only assign an iterable
常见实用场景
利用长度不匹配特性,实现简洁高效的原地操作:
立即学习“Python免费学习笔记(深入)”;
-
清空某段:
nums[2:5] = [] -
批量替换:
data[3:6] = ['new', 'values'] -
在指定位置插入(用空切片):
items[2:2] = ['a', 'b'](在索引 2 前插入) -
替换全部元素(清空并填充):
lst[:] = [1, 2, 3](等价于lst.clear(); lst.extend([1,2,3]))
注意边界和步长限制
切片赋值只支持普通切片(即步长为 1 的切片)。带步长的切片(如 a[::2])**不支持赋值**,会触发 TypeError。
- ✅ 允许:
a[1:4] = [...],a[:] = [...],a[2:] = [...] - ❌ 不允许:
a[::2] = [...],a[1:5:2] = [...]
TypeError: attempt to assign sequence of size X to extended slice of size Y










