簡單了解python列表和元組的區(qū)別
列表(list)和元組(tuple)的一些基礎(chǔ)
list和tuple都是一個可以放置任意數(shù)據(jù)類型的有序集合,都是既可以存放數(shù)字、字符串、對象等
list和tuple都支持負索引
In [8]: nums[-2]
Out[8]: 'ad'
In [9]: tp[-2]
Out[9]: '33'
list和tuple都支持切片操作
In [10]: nums[1:3]
Out[10]: [3, 'ad']
In [11]: tp[1:3]
Out[11]: (3, '33')
list和tuple都可以隨意嵌套
In [12]: nums = [[1,2,3],['s','ff'],['34',3,5]]
In [13]: tp = ((23,4,'f'),45,'d',('dd',4,'ff'))
list和tuple的一些區(qū)別
列表是動態(tài)的,長度大小不固定,可以隨意的增加、刪除、修改元素元組是靜態(tài)的,長度在初始化的時候就已經(jīng)確定不能更改,更無法增加、刪除、修改元素
從圖中看出我們對list做出修改是成功的,但是對tuple修改的時候,確拋出了錯誤,那如果想對tuple做出改變該如何做呢?只能重新開辟一塊內(nèi)存,重新生成新到的tuple了。
從tuple的源碼中也可以看出,只有兩個自帶的方法,一個是統(tǒng)計元素出現(xiàn)的次數(shù)一個是查詢元素的索引。
list和tuple存儲方式的差異
我們先來看個例子
In [19]: nums=['a',1,2]
In [20]: tp=('a',1,2)
In [21]: nums.__sizeof__()
Out[21]: 64
In [22]: tp.__sizeof__()
Out[22]: 48
這里構(gòu)造了一個list和一個tuple。他們存儲的內(nèi)容是相同的,__sizeof__方法可以打印系統(tǒng)分配空間的大小??梢钥吹剿麄兯加玫膬?nèi)存空間是不同的,存儲的內(nèi)容相同,但是list比tuple多占用了16自己的內(nèi)存。
先來看一下一個數(shù)組的內(nèi)存分配過程:
In [23]: l=[] In [24]: l.__sizeof__() // 空列表分配了40字節(jié)的內(nèi)存 Out[24]: 40 In [25]: l.append('a') // 增加了一個一個元素后,給列表分配了72字節(jié)的內(nèi)存,一個字符8個字節(jié) // 那就是一次性分配了4個字符的內(nèi)存空間 In [26]: l.__sizeof__() Out[26]: 72 In [27]: l.append('b') // 再增加字符,占用內(nèi)存不變 In [28]: l.__sizeof__() Out[28]: 72 In [29]: l.append('c') // 再增加字符,占用內(nèi)存不變 In [30]: l.__sizeof__() Out[30]: 72 In [31]: l.append('d') // 再增加字符,占用內(nèi)存不變 In [32]: l.__sizeof__() Out[32]: 72 In [33]: l.append('e') // 再添加元素,內(nèi)存不夠,觸發(fā)重新的內(nèi)存分配 In [34]: l.__sizeof__() Out[34]: 104
可以看出list為了能夠?qū)崟r追蹤內(nèi)存的使用情況,當空間不足時以及分配額外空間,額外的多分配了內(nèi)存,而且還需要存儲指針,指向?qū)?yīng)的元素。
我們可以看到,為了減小每次增加 / 刪減操作時空間分配的開銷,Python 每次分配空間時都會額外多分配一些,這樣的機制(over-allocating)保證了其操作的高效性:增加 / 刪除的時間復(fù)雜度均為 O(1)。但是對于元組,情況就不同了。元組長度大小固定,元素不可變,所以存儲空間固定。
所以說在存儲大量的數(shù)據(jù)的時候,這種差異是需要考慮的,如果數(shù)據(jù)發(fā)生變更的可能性不大,就用元組存儲,如果數(shù)據(jù)是需要頻繁的進行數(shù)據(jù)的修改增加,就使用列表
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python unix時間戳轉(zhuǎn)換毫秒的實現(xiàn)
Unix時間戳是一種常見的時間表示方式,本文主要介紹了python unix時間戳轉(zhuǎn)換毫秒的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01提升Python Scrapy庫數(shù)據(jù)采集速度實現(xiàn)高效爬蟲
Scrapy是一個強大而靈活的Python爬蟲框架,被廣泛用于數(shù)據(jù)采集、網(wǎng)站抓取和網(wǎng)絡(luò)爬蟲開發(fā),本文將深入介紹Scrapy的功能和用法,并提供豐富的示例代碼,幫助更好地理解和應(yīng)用2023-11-11Python中關(guān)于print和return的區(qū)別
這篇文章主要介紹了Python中關(guān)于print和return的區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02Python?OpenCV形態(tài)學(xué)運算示例詳解
這篇文章主要為大家介紹了OpenCV中的幾個形態(tài)學(xué)運算,例如:腐蝕&膨脹、開&閉運算、梯度運算、頂帽運算黑帽運算,感興趣的可以了解一下2022-04-04Python實現(xiàn)批量生成,重命名和刪除word文件
這篇文章主要為大家詳細介紹了Python如何利用第三方庫實現(xiàn)批量生成、重命名和刪除word文件的功能,文中的示例代碼講解詳細,需要的可以參考一下2023-03-03