python復(fù)制列表時(shí)[:]和[::]之間有什么區(qū)別
前言
new = old[:]
Python老鳥都知道以上代碼是什么意思。它復(fù)制列表old到new。它對(duì)于新手來(lái)說(shuō)是種困惑而且應(yīng)該避免使用這種方法。不幸的是[:]標(biāo)記法被廣泛使用,可能是Python程序員不知道更好的列表復(fù)制法吧。然而本文給大家介紹的是關(guān)于python復(fù)制列表時(shí)[:]和[::]之間有什么區(qū)別,下面來(lái)一起看看吧
我們可以(淺)使用[:]復(fù)制列表:
l = [1, 2, 3] z1 = l[:]
我們也可以(淺)使用[::]復(fù)制它:
z2 = [::]
現(xiàn)在z1 == z2將為True.在Explain Python's slice notation閱讀答案后,我了解這些圖片的工作原理.
但是,我的問題是這兩個(gè)內(nèi)部是否有區(qū)別?在復(fù)制中比其他效率更高,還是做完全相同的事情?
最佳答案
他們之間絕對(duì)沒有區(qū)別,至少在Python 3中.如果你愿意,可以使用dis.dis來(lái)檢查每個(gè)這些使用的字節(jié)碼:
l = [1, 2, 3, 4]
針對(duì)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
你可以看到,它們完全一樣.對(duì)于構(gòu)建切片(BUILD_SLICE)的起始和停止值都加載一些無(wú)(兩個(gè)LOAD_CONSTS),并應(yīng)用它. NONE是Standard Type hierarchy中切片文檔中所述的默認(rèn)值:
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.
使用[:],它的鍵擊少.
實(shí)際上有趣的是,在Python 2.x中,生成的字節(jié)代碼是不同的,由于l [:]的命令較少,可能會(huì)稍微更高效:
>>> 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
而對(duì)于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
即使我沒有定時(shí)這些(我不會(huì),差異應(yīng)該很小)看起來(lái),由于只需要更少的指示,l [:]可能稍微好一點(diǎn).
這種相似性當(dāng)然不存在于列表中;它適用于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
對(duì)于別人也是如此.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
8段用于數(shù)據(jù)清洗Python代碼(小結(jié))
這篇文章主要介紹了8段用于數(shù)據(jù)清洗Python代碼(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Python中使用print函數(shù)進(jìn)行不換行打印問題
這篇文章主要介紹了Python中使用print函數(shù)進(jìn)行不換行打印問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python?OpenCV超詳細(xì)講解讀取圖像視頻和網(wǎng)絡(luò)攝像頭
OpenCV用C++語(yǔ)言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實(shí)時(shí)視覺應(yīng)用,并在可用時(shí)利用MMX和SSE指令,本篇文章帶你了解OpenCV讀取圖像視頻與網(wǎng)絡(luò)攝像頭的方法2022-04-04python TK庫(kù)簡(jiǎn)單應(yīng)用(實(shí)時(shí)顯示子進(jìn)程輸出)
這篇文章主要介紹了python TK庫(kù)簡(jiǎn)單應(yīng)用(實(shí)時(shí)顯示子進(jìn)程輸出),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python用于url解碼和中文解析的小腳本(python url decoder)
這篇文章主要介紹了python用于url解碼和中文解析的代碼,需要的朋友可以參考下2013-08-08PyTorch簡(jiǎn)單手寫數(shù)字識(shí)別的實(shí)現(xiàn)過(guò)程
Pytorch是熱門的深度學(xué)習(xí)框架之一,通過(guò)經(jīng)典的MNIST數(shù)據(jù)集進(jìn)行快速的pytorch入門,這篇文章主要給大家介紹了關(guān)于PyTorch簡(jiǎn)單手寫數(shù)字識(shí)別的相關(guān)資料,需要的朋友可以參考下2021-11-11python網(wǎng)絡(luò)爬蟲精解之XPath的使用說(shuō)明
XPath 是一門在 XML 文檔中查找信息的語(yǔ)言。XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上2021-09-09Python 內(nèi)置函數(shù)進(jìn)制轉(zhuǎn)換的用法(十進(jìn)制轉(zhuǎn)二進(jìn)制、八進(jìn)制、十六進(jìn)制)
這篇文章主要介紹了使用Python內(nèi)置函數(shù):bin()、oct()、int()、hex()可實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的一些用法,需要的朋友可以參考下2018-04-04python json 遞歸打印所有json子節(jié)點(diǎn)信息的例子
今天小編就為大家分享一篇python json 遞歸打印所有json子節(jié)點(diǎn)信息的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02