這章我們繼續(xù)講元組類型。
上章說(shuō)到元組是不可變類型,意思是元組的內(nèi)存地址不可變,但是如果我宰割個(gè)元組里存字典和列表這兩種可變類型,我們是可以修改里面嵌套的列表和字典的值的。
因?yàn)榱斜砗妥值涫强勺冾愋吐?,即使我們改了它里面的值,而它本身的?nèi)存地址也不會(huì)法傷改變,這樣也就不會(huì)導(dǎo)致元組里面存的這個(gè)列表和字典的內(nèi)存地址發(fā)生變化。
繼續(xù)用上一章的代碼,試試?yán)锩娴膄能不能改。
x = (33, 'f', 2.4)
x[1]=(x)
print(x)
結(jié)果就是報(bào)錯(cuò)了,就是不能改元組里面的值。
現(xiàn)在我在這個(gè)元組里面嵌套一個(gè)字列表,然后再去改它的子列表。如果直接對(duì)這個(gè)字列表 進(jìn)行賦值,那就相當(dāng)于我們要用一個(gè)新的地址,覆蓋它原來(lái)的這個(gè)地址,這肯定是不行的。
我現(xiàn)在改字列表的第三個(gè)索引,然后打印。結(jié)果就是我們重新賦值的‘e’。
x = (33, 'f', 2.4, ['a', 'b', 'c'])
x[3][0]='e'
print(x[3][0])
這也就驗(yàn)證了剛剛的分析,只要你沒(méi)動(dòng)元組里存的內(nèi)存地址,你可以隨便修改。我們現(xiàn)在打印修改前和修改后的id。
x = (33, 'f', 2.4, ['a', 'b', 'c'])
print(id(x[3]))
x[3][0]='e'
print(id(x[3]))
結(jié)果兩個(gè)id是沒(méi)有變化的。
既然元組是不可變類型,那么么要這個(gè)元組有什么意義呢?
如果我想存多個(gè)值,并且以后也沒(méi)有要修改它的需求,那我就用列表定義然后我不去改定它不就行了,為什么還要元組這個(gè)類型呢?
雖然說(shuō)這種情況下可以以使用列表,但是用元組也更加合理。你可以想象一下,由于列表的功能更加的豐富,不但能實(shí)現(xiàn)讀的需求,海哥已實(shí)現(xiàn)改的需求。就像一家企業(yè)一樣,你公司的業(yè)務(wù)涉及的越廣,你的公司就會(huì)越龐大。
放在列表和元組上來(lái)說(shuō),也是一樣,在存同等數(shù)據(jù)的情況下,毫無(wú)疑問(wèn),肯定是元組更加省內(nèi)存空間。
所以我們以后寫(xiě)項(xiàng)目的時(shí)候,遇到一組數(shù)據(jù)只有讀的需求,沒(méi)有改的需求,那最優(yōu)的方案就是使用元組。當(dāng)然你就喜歡用列表也沒(méi)問(wèn)題,效率影響也不是那么大。
我們加下去來(lái)看元組的類型轉(zhuǎn)換,這就很簡(jiǎn)單了,和列表一樣,只要能被for循環(huán)遍歷的類型都可以轉(zhuǎn)成元組類型。
首先字符串肯定是可以轉(zhuǎn)成元組類型的,然后列表也可以,地點(diǎn)也行,甚至我們學(xué)過(guò)的range方法也可以。
print(tuple('xxx'))
print(tuple([1,2,3]))
print(tuple({'q':1}))
print(tuple(range(5)))
就全部轉(zhuǎn)成元組類型了。
然后我們來(lái)看元組的功能,由于元組不像列表,還可以往里面添加值、刪除值以及修改值。
元組就很簡(jiǎn)單只有七個(gè)功能分別是查找元素的起始索引、查看元素的出現(xiàn)次數(shù)、索引取值、切片、統(tǒng)計(jì)長(zhǎng)度、成員運(yùn)算、循環(huán)。
這七個(gè)功能和列表一樣,你自己多練習(xí)幾遍就熟悉了。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python 元組類型2