python復(fù)制列表時[:]和[::]之間有什么區(qū)別
前言
new = old[:]
Python老鳥都知道以上代碼是什么意思。它復(fù)制列表old到new。它對于新手來說是種困惑而且應(yīng)該避免使用這種方法。不幸的是[:]標記法被廣泛使用,可能是Python程序員不知道更好的列表復(fù)制法吧。然而本文給大家介紹的是關(guān)于python復(fù)制列表時[:]和[::]之間有什么區(qū)別,下面來一起看看吧
我們可以(淺)使用[:]復(fù)制列表:
l = [1, 2, 3] z1 = l[:]
我們也可以(淺)使用[::]復(fù)制它:
z2 = [::]
現(xiàn)在z1 == z2將為True.在Explain Python's slice notation閱讀答案后,我了解這些圖片的工作原理.
但是,我的問題是這兩個內(nèi)部是否有區(qū)別?在復(fù)制中比其他效率更高,還是做完全相同的事情?
最佳答案
他們之間絕對沒有區(qū)別,至少在Python 3中.如果你愿意,可以使用dis.dis來檢查每個這些使用的字節(jié)碼:
l = [1, 2, 3, 4]
針對l [:]發(fā)出的字節(jié)碼:
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 [::]發(fā)送的字節(jié)碼:
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
你可以看到,它們完全一樣.對于構(gòu)建切片(BUILD_SLICE)的起始和停止值都加載一些無(兩個LOAD_CONSTS),并應(yīng)用它. NONE是Standard Type hierarchy中切片文檔中所述的默認值:
Special read-only attributes: start is the lower bound; stop is the upper bound; step is the step value; each is None if omitted. These attributes can have any type.
使用[:],它的鍵擊少.
實際上有趣的是,在Python 2.x中,生成的字節(jié)代碼是不同的,由于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
即使我沒有定時這些(我不會,差異應(yīng)該很小)看起來,由于只需要更少的指示,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
對于別人也是如此.
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
python之no module named xxxx以及虛擬環(huán)境配置過程
在Python開發(fā)過程中,經(jīng)常會遇到環(huán)境配置和包管理的問題,主要原因包括未安裝所需包或使用虛擬環(huán)境導(dǎo)致的,通過pip install命令安裝缺失的包是解決問題的一種方式,此外,使用虛擬環(huán)境,例如PyCharm支持的Virtualenv,可以為每個項目創(chuàng)建獨立的運行環(huán)境2024-10-10
pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹
這篇文章主要介紹了pytorch之關(guān)于PyTorch結(jié)構(gòu)的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
django實現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義
這篇文章主要介紹了django實現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python 實現(xiàn)rolling和apply函數(shù)的向下取值操作
這篇文章主要介紹了python 實現(xiàn)rolling和apply函數(shù)的向下取值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

