Python切片赋值怎么用_切片赋值行为解析

1次阅读

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

Python切片赋值怎么用_切片赋值行为解析

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
text=ZqhQzanResources