【发布时间】:2017-11-06 01:18:02
【问题描述】:
我相信在 python 中拼接列表总是会创建列表的浅表副本。但是,这对于拼接任务仍然适用吗?
例如:
list[::10] = list[10:20]
list[::10] 会创建一个新列表吗?如果我的理解是正确的, list[::10] 不使用任何空间,但 list[10:20] 通过创建新列表来使用空间
【问题讨论】:
标签: python-3.x
我相信在 python 中拼接列表总是会创建列表的浅表副本。但是,这对于拼接任务仍然适用吗?
例如:
list[::10] = list[10:20]
list[::10] 会创建一个新列表吗?如果我的理解是正确的, list[::10] 不使用任何空间,但 list[10:20] 通过创建新列表来使用空间
【问题讨论】:
标签: python-3.x
使用dis,我们可以查看 Python 解释器实际将我们的代码解释成什么。
from dis import dis
dis('l[::10] = l[10:20]')
给我们
1 0 LOAD_NAME 0 (l)
3 LOAD_CONST 0 (10)
6 LOAD_CONST 1 (20)
9 BUILD_SLICE 2
12 BINARY_SUBSCR
13 LOAD_NAME 0 (l)
16 LOAD_CONST 2 (None)
19 LOAD_CONST 2 (None)
22 LOAD_CONST 0 (10)
25 BUILD_SLICE 3
28 STORE_SUBSCR
29 LOAD_CONST 2 (None)
32 RETURN_VALUE
我们可以看到有两个BUILD_SLICE 操作,一个用于l[::10],另一个用于l[10:20]。所以这两个切片在内存中都由对象表示。
编辑:
值得注意的是,这是 CPython 3.5 的反汇编字节码
CPython 是“标准”实现,但其他 Python 实现/版本可能会有所不同。
【讨论】: