Skip to content

理解Python的切片赋值

Python切片表示法

基本语法

为了理解Python的切片赋值,你至少应该对切片的工作原理有一定的了解。这里是一个快速回顾:

[起始位置:终止位置:步长]

其中,起始位置是要返回的第一个元素的索引(包括在内),终止位置是要停止的元素之前的索引(不包括在内),步长是任意两个元素之间的间隔。

切片赋值与切片列表具有相同的语法,唯一的区别是它用在表达式的左侧而不是右侧。由于切片返回一个列表,切片赋值需要一个列表(或其他可迭代对象)。而且,正如其名称所示,右侧应该是要赋值给表达式左侧切片的值。例如:

nums = [1, 2, 3, 4, 5]

nums[:1] = [6]        # [6, 2, 3, 4, 5]   (替换索引0到1的元素)
nums[1:3] = [7, 8]    # [6, 7, 8, 4, 5]   (替换索引1到3的元素)
nums[-2:] = [9, 0]    # [6, 7, 8, 9, 0]   (替换最后2个元素)

改变长度

在表达式左侧的切片返回的列表部分将被切片赋值改变。这意味着你可以使用切片赋值来用长度不同的不同列表替换列表的一部分。例如:

nums = [1, 2, 3, 4, 5]

nums[1:4] = [6, 7]    # [1, 6, 7, 5]        (用2个元素替换3个元素)
nums[-1:] = [8, 9, 0] # [1, 6, 7, 8, 9, 0]  (用3个元素替换1个元素)
nums[:1] = []         # [6, 7, 8, 9, 0]     (用0个元素替换1个元素)

如果考虑空切片,你还可以在列表中插入元素而不替换任何元素。例如:

nums = [1, 2, 3, 4, 5]

nums[2:2] = [6, 7]    # [1, 2, 6, 7, 3, 4, 5]   (插入2个元素)
nums[7:] = [8, 9]     # [1, 2, 6, 7, 3, 4, 5, 8, 9] (追加2个元素)
nums[:0] = [0]        # [0, 1, 2, 6, 7, 3, 4, 5, 8, 9] (前置1个元素)
nums[:] = [ 4, 2]     # [4, 2]         (用新列表替换整个列表)

使用步长

最后但并非最不重要的是,在切片赋值中也可以使用步长,你可以使用它来替换与每个步长之后的迭代匹配的元素。唯一的区别是,如果步长不是1,则插入的列表必须与返回的列表切片的长度完全相同。例如:

```py nums = [1, 2, 3, 4, 5]

nums[2:5:2] = [6, 7] # [1, 2, 6, 4, 7](替换第2到第5个元素中的每个第2个元素) nums[2:5:2] = [6, 7, 8] # 抛出 ValueError(无法用3个元素替换2个元素) nums[1::-1] = [9, 0] # [0, 9, 6, 4, 7](逆序替换,从第1个元素到起始位置)