Spe*_*ode 3 python list python-2.7
我知道这个语法是如何工作的,但是我想知道python如何替换并改变左侧列表的过程.防爆.
L = [0, 1, 2, 3, 4]
L[0:2] = [5]
print L #L is now [5, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
python如何解决这个问题?
这是通过__setitem__或__setslice__方法完成的.(__setslice__已弃用IIRC并在python3.x中删除).
对于列表,表达式:
L[start: stop] = some_iterable
Run Code Online (Sandbox Code Playgroud)
将从some_iterable索引中取出项目并替换索引中的元素从开始到停止(不包括).因此,在您的演示代码中,您有:
L[0:2] = [5]
Run Code Online (Sandbox Code Playgroud)
这需要的元素在索引0和1与替换它们5.
请注意,替换列表的长度不必与其替换的子列表的长度相同.
也许更好的方式来考虑它是作为一种就地方式来做到以下几点:
L[a:b] = c
# equivalent to the following operation (done in place)
L[:a] + list(c) + L[b:]
Run Code Online (Sandbox Code Playgroud)
如果你真的很好奇它是如何发生的,源代码是最好的参考. PyList_SetSlice调用list_ass_slice,它将右侧的iterable转换为序列(tuple或listIIRC).它调整数组大小以保存适当数量的数据,将切片右侧的内容复制到适当的位置,然后复制新数据.根据列表是增长还是缩小,有一些不同的代码路径(和操作顺序),但这是它的基本要点.