您好,登錄后才能下訂單哦!
Python 中的 列表跟元組 的使用
一、列表和元組基礎(chǔ):
列表和元組,都是一個(gè)可以放置任意數(shù)據(jù)類型的有序集合。
在很多語言中,集合的數(shù)據(jù)類型必須一致。不過,對(duì)于 Python 的列表和元組來說,并無此要求:
my_list = [66, 77, 'fe', 'cow'] # 列表中同時(shí)含有int和string類型的元素
print(my_list)
# 輸出結(jié)果: [66, 77, 'fe', 'cow']
my_tuple = ('fe_cow', 666) # 元組中同時(shí)含有int和string類型的元素
print(my_tuple)
# 輸出結(jié)果 ('fe_cow', 666)
那么它們之間有什么區(qū)別呢?
列表是動(dòng)態(tài):長(zhǎng)度大小不固定,可以隨意地增加、刪減或者改變?cè)亍?/p>
元組是靜態(tài):長(zhǎng)度大小固定,無法增加刪減或者改變。
下面舉個(gè)栗子:
分別創(chuàng)建一個(gè)列表和元組。對(duì)于列表很輕松的在列表中添加最后一個(gè)元素,但是相同操作元組就會(huì)報(bào)錯(cuò):
my_list = [1, 2, 3, 4]
my_list[3] = 5 # python 中索引是從0進(jìn)行開始的 my_list[3] 表示訪問列表的第四個(gè)元素
print(my_list)
# 輸出結(jié)果: [1, 2, 3, 5]
my_tuple = (1, 2, 3, 4)
my_tuple[3] = 5
print(my_tuple)
# 報(bào)錯(cuò)結(jié)果:
Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
如果想對(duì)已有的元組做"改變",那就只能重新開辟一塊內(nèi)存,創(chuàng)建新的元組了。
my_tuple= (1, 2, 3)
new_tuple = my_tuple + (4, )
print(new_tuple)
# 輸出結(jié)果: (1, 2, 3, 4)
Python 中的列表和元組都支持負(fù)數(shù)索引:
// 列表的負(fù)數(shù)索引
my_list = [1, 2, 3, 4]
my_list[-1]
4
// 元組的負(fù)數(shù)索引
my_tuple = (1, 2, 3, 4)
my_tuple[-2]
3
-1 表示最后一個(gè)元素,-2 表示倒數(shù)第二個(gè)元素,以此類推。
Python 列表和元組都支持切片操作:
// 列表切片操作
my_list = [1, 2, 3, 4]
my_list[1:3]
[2, 3]
// 元組切片操作
my_tuple = (1, 2 ,3 ,4)
my_tuple[1:3]
(2, 3)
索引從1到2,簡(jiǎn)單理解:“前閉后開”
Python 可通過list() 和 tuple() 函數(shù)相互轉(zhuǎn)換:
// 元組轉(zhuǎn)換成列表
list((1, 2, 3))
[1, 2, 3]
// 列表轉(zhuǎn)換成元組
tuple([1, 2, 3])
(1, 2, 3)
Python 列表 和 元組的常見內(nèi)置函數(shù):
// 列表操作
my_list = [3, 2, 3, 7, 8, 1]
my_list.count(3)
2
my_list.index(7)
3
my_list.reverse()
my_list
[1, 8, 7, 3, 2, 3]
my_list.sort()
my_list
[1, 2, 3, 3, 7, 8]
// 元組操作
my_tuple = (3, 2, 3, 7, 8, 1)
my_tuple.count(3)
2
my_tuple.index(7)
3
list(reversed(my_tuple))
[1, 8, 7, 3, 2, 3]
sorted(my_tuple)
[1, 2, 3, 3, 7, 8]
count(item):表示統(tǒng)計(jì)列表 / 元組中 item 出現(xiàn)的次數(shù)。
index(item):表示返回列表 / 元組中 item 第一次出現(xiàn)的索引。
list.reverse() 和 list.sort() 分別表示原地倒轉(zhuǎn)列表和排序。
注意,元組沒有內(nèi)置的這兩個(gè)函數(shù),需要把元組轉(zhuǎn)換成列表在進(jìn)行此函數(shù)的操作
reversed() 和 sorted() 同樣表示對(duì)列表 / 元組進(jìn)行倒轉(zhuǎn)和排序,但是會(huì)返回一個(gè)倒轉(zhuǎn)后或者排好序的新的列表 / 元組。
二、列表和元組存儲(chǔ)方式差異:
// 使用__sizeof__() 查看 存儲(chǔ)空間
my_list = [1,2 ,3 ,4]
my_list.__sizeof__()
72
my_tuple = (1, 2, 3, 4)
my_tuple.__sizeof__()
56
可以看到,放置了相同的元素,那么元組存儲(chǔ)的空間卻比列表要少16字節(jié)。為什么呢?原因如下:
列表是動(dòng)態(tài)的,所以它需要存儲(chǔ)指針,來指向?qū)?yīng)的元素(int型,8字節(jié))。
列表可變,所以需要額外存儲(chǔ)已經(jīng)分配的長(zhǎng)度大小(8 字節(jié)),這樣才可以實(shí)時(shí)追蹤列表空間的使用情況,當(dāng)空間不足時(shí),及時(shí)分配額外空間。
下面描述列表空間分配過程:鄭州人流價(jià)格 http://www.zzzykdfk.com/
my_list = []
my_list.__sizeof__() // 空列表的存儲(chǔ)空間為40字節(jié)
40
my_list.append(1)
my_list.__sizeof__()
72 // 加入了元素1之后,列表為其分配了可以存儲(chǔ)4個(gè)元素的空間 (72 - 40)/8 = 4
# 記錄往后加入4個(gè)元素
my_list.append(2)
my_list.__sizeof__()
72 // 由于之前分配了空間,所以加入元素2,列表空間不變
my_list.append(3)
my_list.__sizeof__()
72 // 加入元素3,列表空間不變
my_list.append(4)
my_list.__sizeof__()
72 // 加入元素4,列表空間不變
my_list.append(5)
my_list.__sizeof__()
104 // 加入元素5之后,列表的空間不足,所以又額外分配了可以存儲(chǔ)4個(gè)元素的空間
為了減少列表每次的增加/刪除操作時(shí)空間分配的開銷,Python每次分配空間時(shí),都會(huì)額外多分配一些;
這樣機(jī)制保證了其操作的高效性:增加/刪除的時(shí)間復(fù)雜度0(1);
對(duì)于元組來說,元組長(zhǎng)度大小固定,元素不可變,所以存儲(chǔ)空間固定。
三、列表和元組的性能:
從上述的兩者之間的存儲(chǔ)方式差異,可以得出結(jié)論,元組要比列表更加輕量級(jí)一些,元組的性能速度要略優(yōu)于列表。
在Python后臺(tái),對(duì)靜態(tài)數(shù)據(jù)做一些資源緩存。因?yàn)槔厥諜C(jī)制的存在,如果一些變量不被使用了,Python 就會(huì)回收它們所占用的內(nèi)存,返還給操作系統(tǒng),以便其他變量或其他應(yīng)用使用。
對(duì)于一些靜態(tài)變量,比如元組,它不被使用并且占用空間不大時(shí),Python 會(huì)暫時(shí)緩存這部分內(nèi)存。下次我們?cè)賱?chuàng)建同樣大小的元組時(shí),Python 就不用再向操作系統(tǒng)發(fā)出請(qǐng)求,可直接尋找內(nèi)存,而是可以直接分配之前緩存的內(nèi)存空間,這樣就能大大加快程序的運(yùn)行速度。
四、列表和元組的使用場(chǎng)景:
如果存儲(chǔ)的數(shù)據(jù)和數(shù)量不變,僅需要將數(shù)據(jù)直接傳給前端渲染,那么肯定選用元組更合適。
// 比如給前端返回經(jīng)緯度
def get_location():
.....
return (longitude, latitude)
如果存儲(chǔ)的數(shù)據(jù)或數(shù)量是可變的,那么則用列表更合適。
// 比如給前端返回 每個(gè)增加教師的信息
teacher_list = [] // 里面存儲(chǔ)的是
result = DB(teacherID) // 從數(shù)據(jù)庫拿出一周內(nèi)新增教師的信息,返回的是QuerySet
for item in result:
teacher_list.append(item)
五、總結(jié):
列表和元組都是有序的,可以存儲(chǔ)任意的數(shù)據(jù)類型的集合,主要區(qū)別在于:
列表是動(dòng)態(tài)的,長(zhǎng)度可變,可以隨意的增加、刪減或改變?cè)亍?/p>
列表的存儲(chǔ)空間略大于元組,性能略遜于元組;
元組是靜態(tài)的,長(zhǎng)度大小固定,不可以對(duì)元素進(jìn)行增加、刪減或者改變操作。
元組相對(duì)于列表更加輕量級(jí),性能稍優(yōu);
六、list()、與 [ ] 效率有什么區(qū)別嗎?
區(qū)別在于:
list( ) 是一個(gè)函數(shù)的調(diào)用,Python 函數(shù)調(diào)用 會(huì)創(chuàng)建 堆,并且進(jìn)行一系列參數(shù)檢查的操作。
[ ] 是一個(gè) 內(nèi)置的C函數(shù),可以直接調(diào)用,因此效率較高。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。