我们可以(浅)复制使用[:]
一个list
:复制列表时'[:]'和'[::]'切片之间的区别?
l = [1, 2, 3]
z1 = l[:]
我们也可以(浅)复制使用[::]
:
z2 = l[::]
现在z1 == z2
将True
。我在阅读Explain Python's slice notation中的答案后了解这些切片是如何工作的。
但是,我的问题是,这两个内部有什么区别吗?在复制过程中,一个人比另一个人更有效率,还是他们做的事情完全一样?
我们可以(浅)复制使用[:]
一个list
:复制列表时'[:]'和'[::]'切片之间的区别?
l = [1, 2, 3]
z1 = l[:]
我们也可以(浅)复制使用[::]
:
z2 = l[::]
现在z1 == z2
将True
。我在阅读Explain Python's slice notation中的答案后了解这些切片是如何工作的。
但是,我的问题是,这两个内部有什么区别吗?在复制过程中,一个人比另一个人更有效率,还是他们做的事情完全一样?
绝对没有区别,至少在Python 3。您可以检查每一个使用dis.dis
产生的字节码,如果你想:为l[:]
发出
l = [1, 2, 3, 4]
字节码:
from dis import dis
dis('l[:]')
1 0 LOAD_NAME 0 (l)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 BUILD_SLICE 2
12 BINARY_SUBSCR
13 RETURN_VALUE
同时,字节码l[::]
发出:
dis('l[::]')
1 0 LOAD_NAME 0 (l)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 BUILD_SLICE 2
12 BINARY_SUBSCR
13 RETURN_VALUE
你可以看到,他们是完全一样的。对于用于构建切片(BUILD_SLICE
)的值start
和stop
,都加载一些None
(两个LOAD_CONSTS
)并应用它。 None
s为这些默认作为Standard Type hierarchy在文档中表示为slices
:
特殊只读属性:
start
是绑定的lower
;stop
是上限;step
是step
的值;如果省略,每个是None
。这些属性可以有任何类型。
使用[:]
,它的键击较少。
它实际上是有趣的是,在Python 2.x
生成的字节码是不同的,由于对l[:]
它可能是稍微更好的性能,更少的命令:
>>> def foo():
... l[:]
...
>>> dis(foo)
2 0 LOAD_GLOBAL 0 (l)
3 SLICE+0
4 POP_TOP
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
虽然为l[::]
:
>>> def foo2():
... l[::]
...
>>> dis(foo2)
2 0 LOAD_GLOBAL 0 (l)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 LOAD_CONST 0 (None)
12 BUILD_SLICE 3
15 BINARY_SUBSCR
16 POP_TOP
17 LOAD_CONST 0 (None)
20 RETURN_VALUE
即使我没有计时这些(和我不会,差别应该很小),看起来,由于需要更少的指令,l[:]
可能会稍微好一些。
这种相似性当然并不只针对列表存在;它适用于Python中的所有序列:
# Note: the Bytecode class exists in Py > 3.4
>>> from dis import Bytecode
>>>
>>> Bytecode('(1, 2, 3)[:]').dis() == Bytecode('(1, 2, 3)[::]').dis()
True
>>> Bytecode('"string"[:]').dis() == Bytecode('"string"[::]').dis()
True
类似的为其他。
根据Python language reference section 6.3.2, Subscriptions,序列的内部表达式必须计算为整数或切片。这两个例子都产生相同的切片,因此是相同的。还有许多其他切片具有相同的效果,通过明确声明默认值(start=0
,stop=len(sequence)
或更多,step=1
)。
这是第一个让它成为切片的冒号,第二个不会改变任何东西。你可以想出其他各种选择('[0:]','[:: 1]',...),但它们也是一样的。 – jonrsharpe
这个问题并没有真正回答我的问题,但是,我知道是什么让我只是徘徊,如果它们之间存在差异片我 – user6774416
虽然这个问题可能会涵盖http://stackoverflow.com/q/509211/674064,它比http://stackoverflow.com/q/509211/674064更具体,并具有其自身的优点。因此投票重新开放。 –