Python列表切片赋值疑问:正向切片可多元素赋值反向为何不行?
Python列表切片赋值的差异解析
先拆解两个切片的本质规则差异:
示例1的切片:L[0:2:1]
这个切片步长为1(正向遍历,步长1是Python切片的默认值,写不写效果一致),属于普通切片。对于普通切片,Python的处理逻辑是:把切片覆盖的原元素(这里是索引0、1的两个元素)全部移除,再将新序列的所有元素插入到该位置。因此不管新序列长度多少,都能执行成功,列表长度会自动调整——原列表10个元素,去掉2个再加5个,最终变成13个,也就是你看到的输出结果。
示例2的切片:L[-1:-2:-1]
这个切片步长为-1(反向遍历),属于扩展切片(只要步长不等于1,都归为扩展切片)。扩展切片选取的是离散的单个元素位置:从索引-1(最后一个元素9)出发,往索引-2的方向移动,步长-1的情况下只会选中1个元素。对于扩展切片,Python强制要求赋值的序列长度必须和切片选中的元素数量完全匹配——你给了5个元素,但切片只对应1个位置,因此触发ValueError报错。
如果想在示例2的场景下插入/替换多个元素,可以换用普通切片写法:
# 方式1:在最后一个元素前插入5个99 L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] L[-1:-1] = [99,99,99,99,99] print(L) # 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 99, 99, 99, 99, 9]
# 方式2:替换最后一个元素并追加新元素 L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] L[-1:] = [99,99,99,99,99] print(L) # 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 99, 99, 99, 99]
内容的提问来源于stack exchange,提问作者Đặng Khánh
相关产品推荐
相关产品推荐

