【发布时间】:2013-12-25 09:13:50
【问题描述】:
我的一个朋友向我展示了以下 Python 代码:
a[1:] == a[:-1]
如果 a 中的所有项目都相同,则返回 True。
我认为代码乍一看很难理解,而且 - 它在内存使用方面效率低下,因为将创建两个 a 副本用于比较。
我使用 Python 的 dis 来查看 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。 The documentation is unclear 这些操作码是否真的创建了 a 的新副本,或者只是对它的引用。
- SLICE 命令是否复制
a? - 答案是否因 Python 实现(Cython、Jython)而异?
更新
这个 sn-p 显然是不可读和令人困惑的,我不会在实际中使用它 代码。我的兴趣纯粹是技术性的 - 切片是否会复制列表,以及答案是否会在不同情况下有所不同。
【问题讨论】:
-
IMO 的“变化”评论没有多大意义。即使
x == y可以为用户定义的类做任何事情(包括打开弹出窗口或连接到数据库服务器),所以呢? -
它是python的一个特性,而不仅仅是Cpython。我已经链接了python教程中的部分。
标签: python cpython memory-efficient python-internals