作者:王曄 ?????時(shí)間:2019.5.17 19:00

列表和元組
列表(list)和元組(tuple)十分地相似,他們都是可以放任意數(shù)據(jù)類型的有序集合,并且都支持索引 和切片 操作。但是既然是兩種不同的數(shù)據(jù)結(jié)構(gòu),他們必然會(huì)有不同的地方。
在我們?nèi)粘W(xué)習(xí)中,一個(gè)很明顯的區(qū)別就是:
- 列表是動(dòng)態(tài)的,長(zhǎng)度大小不固定,可以隨意地增加、刪減或者改變?cè)兀╩utable)
- 元組是靜態(tài)的,長(zhǎng)度大小固定,無法增加刪減或者改變(immutable)
>>> list = [1, 2, 3, 4]
>>> tuple = (1, 2, 3, 4)
>>>
>>> list.append(5)
>>> list
[1, 2, 3, 4, 5]
>>> tuple.append(5)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
tuple.append(5)
AttributeError: 'tuple' object has no attribute 'append'
>>> list[3]
4
>>> tuple[3]
4
>>> tuple[3]=40
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
tuple[3]=40
TypeError: 'tuple' object does not support item assignment
>>> list[3]=40
>>> list[3]
40
所以如果我們想對(duì)元組進(jìn)行改變,就只能重新開辟一塊內(nèi)存,即創(chuàng)建一個(gè)新的元組。
>>> tuple = (1, 2, 3, 4)
>>> new_tuple = tuple + (5,)
>>> new_tuple
(1, 2, 3, 4, 5)
-
Python的列表和元組都支持負(fù)數(shù)索引,-1表示最后一個(gè)元素。
并且他們都支持嵌套操作:
>>> list=[[1,2,3],[4,5,6]]
>>> tuple = ((1,2,3),(4,5,6))
- 還支持相互轉(zhuǎn)換,且返回值為新的列表/元組,不改變?cè)袛?shù)據(jù)結(jié)構(gòu):
>>> ls = [1, 2, 3]
>>> tp = (1, 2, 3)
>>> list(tp)
[1, 2, 3]
>>> tuple(ls)
(1, 2, 3)
>>> tp
(1, 2, 3)
>>> ls
[1, 2, 3]
- 列表和元組常用重要的內(nèi)置函數(shù):
>>> l = [3, 2, 3, 7, 8, 1]
>>> l.count(3)
2
>>> l.index(7)
3
>>> l.reverse()
>>> l
[1, 8, 7, 3, 2, 3]
>>> l.sort()
>>> l
[1, 2, 3, 3, 7, 8]
>>> tup = (3, 2, 3, 7, 8, 1)
>>> tup.count(3)
2
>>> tup.index(7)
3
>>> list(reversed(tup))
[1, 8, 7, 3, 2, 3]
>>> sorted(tup)
[1, 2, 3, 3, 7, 8]
count(item)用于統(tǒng)計(jì)item出現(xiàn)的次數(shù)
index(item)用于返回第一次出現(xiàn)item的索引
sort(key=None, reverse=False)用于對(duì)元素進(jìn)行排序,后面?zhèn)魅氲膮?shù),一個(gè)是比較元素,一個(gè)是排序規(guī)則,默認(rèn)為False升序,具體見:List sort()方法
reverse()方法可以將所有元素反向
當(dāng)然還有append(item)(在列表末尾添加新的對(duì)象)、extend()(在列表末尾一次性追加另一個(gè)序列中的多個(gè)值(用新列表擴(kuò)展原來的列表))、remove(item)(移除列表中某個(gè)值的第一個(gè)匹配項(xiàng))、insert(index,item)(從列表中找出某個(gè)值第一個(gè)匹配項(xiàng)的索引位置)、pop([index=-1])(移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值)等等,請(qǐng)參考Python3 列表、Python3 元組,我就不一一贅述了。
-
較為重要的是兩者之間的儲(chǔ)存差異
我們先來看他們的儲(chǔ)存:
>>> list = [1, 2, 3]
>>> list.__sizeof__()
64
>>> tuple = (1, 2, 3)
>>> tuple.__sizeof__()
48
可以看出來他們?cè)趦?chǔ)存相同元素的時(shí)候所占的儲(chǔ)存空間也不一樣,元組的儲(chǔ)存空間要比列表的儲(chǔ)存空間,也就是同等條件下使用元組性能更優(yōu)。
原因有以下幾個(gè):
- 由于列表是動(dòng)態(tài)的,它能改變長(zhǎng)度,需要開辟內(nèi)存存放指針
- 由于列表的空間是不定的,里面有一定的空間增長(zhǎng)算法,來分配額外的空間(over-allocating),可以保證順利的增減數(shù)據(jù)(有利于降低時(shí)間復(fù)雜度,提高效率)
所以我們?cè)趯?shí)際生產(chǎn)生活中,如果我們需要存儲(chǔ)的數(shù)據(jù)是固定不變的,或者返回定長(zhǎng)的數(shù)據(jù),使用元組則效率更加快,當(dāng)然如果數(shù)據(jù)需要不斷地更改的時(shí)候,列表就更為合適。
想要繼續(xù)探究的,可以參考Python的源碼:
