我的一个朋友向我展示了以下 Python 代码:
a[1:] == a[:-1]
a
如果其中的所有项目都相同,则返回 True 。
我认为代码乍一看很难理解,而且 - 它在内存使用方面效率低下,因为a
将创建两个副本用于比较。
我使用 Pythondis
来查看幕后发生的事情a[1:]==a[:-1]
:
>>> def stanga_compare(a):
... return a[1:]==a[:-1]
...
>>> a=range(10)
>>> stanga_compare(a)
False
>>> a=[0 for i in range(10)]
>>> stanga_compare(a)
True
>>> dis.dis(stanga_compare)
2 0 LOAD_FAST 0 (a)
3 LOAD_CONST 1 (1)
6 SLICE+1
7 LOAD_FAST 0 (a)
10 LOAD_CONST 2 (-1)
13 SLICE+2
14 COMPARE_OP 2 (==)
17 RETURN_VALUE
它归结为两个切片命令 -SLICE+1
和SLICE+2
. 文档不清楚这些操作码是否实际上创建了 的新副本a
,或者只是对它的引用。
- SLICE 命令是否复制
a
? - 答案是否因 Python 实现(Cython、Jython)而异?
更新
这个片段显然是不可读和令人困惑的,我不会在实际代码中使用它。我的兴趣纯粹是技术性的——切片是否复制列表,以及答案是否在不同情况下有所不同。