我們可以(淺)複製使用[:]
一個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更具體,並具有其自身的優點。因此投票重新開放。 –