我知道 ww 语法是如何工作的,但我想知道 python 如何替换和更改左侧列表的过程。例如。
L = [0, 1, 2, 3, 4]
L[0:2] = [5]
print L #L is now [5, 2, 3, 4]
python 是如何做到这一点的?
这是通过 __setitem__
或 __setslice__
方法完成的。 (__setslice__
已弃用 IIRC 并在 python3.x 中删除)。
对于列表,表达式:
L[start: stop] = some_iterable
将从 some_iterable
中获取项目并从开始到停止(不包含)替换索引处的元素。因此,在您的演示代码中,您有:
L[0:2] = [5]
这会获取索引 0
和 1
处的元素,并将它们替换为 5
。
请注意,替换列表的长度不需要与其要替换的子列表的长度相同。
也许更好的理解方式是将其视为执行以下操作的就地方法:
L[a:b] = c
# equivalent to the following operation (done in place)
L[:a] + list(c) + L[b:]
如果您真的很好奇它是如何发生的,源代码是最好的引用。 PyList_SetSlice电话 list_ass_slice它将右侧的 iterable 变成一个序列 (tuple
or list
IIRC) 。它调整数组的大小以容纳适当数量的数据,将切片右侧的内容复制到适当的位置,然后复制新数据。根据列表是增长还是收缩,有一些不同的代码路径(和操作顺序),但这就是它的基本要点。
我是一名优秀的程序员,十分优秀!