Python 3.12.6切片赋值长度不匹配为何未抛出ValueError?
Python 3.12.6切片赋值行为解析
这不是bug,也不是3.12.6的行为变更,而是Python对步长为1的切片的长期设计规则:
- 当切片的步长为
1(包括显式写::1或隐式的默认切片[:])时,赋值操作会直接原地替换整个列表的内容为右侧的序列,不会检查原切片选中的元素数量与赋值序列的长度是否匹配。 - 只有当切片的步长不为1时,才会要求赋值序列的长度与切片选中的元素数量一致,否则抛出
ValueError。
验证示例
- 步长为1的切片赋值(无报错):
l3 = [2, 3, 4, 5] l3[::1] = [1, 3] print(l3) # 输出: [1, 3]
注:此操作是原地修改原列表对象,与直接执行l3 = [1, 3](重新绑定变量)的本质不同。
- 步长不为1的切片赋值(长度不匹配时报错):
l3 = [2, 3, 4, 5] l3[::2] = [1] # 切片选中[2,4]共2个元素,赋值序列长度为1 # 抛出错误: ValueError: attempt to assign sequence of size 1 to extended slice of size 2
结论
该行为是Python的有意设计,并非bug,无需在Python问题追踪器上报。你之前的预期混淆了步长为1和步长不为1的切片赋值规则。
内容的提问来源于stack exchange,提问作者Ansh Arya
相关产品推荐
相关产品推荐

