天天看點

python清單嵌套元組拆分_Python的元組嵌套清單,清單方法改變元組内清單,那元組還算不可變麼?...

python的元組、清單其實都像上面畫的一樣,并不是“箱子”,裡面放着“apple” 2233,它們裡面都隻有一些“箭頭”,也就是說隻存儲了其它對象(也就是“apple” 2233這樣的“物體”)的“名字”,這些“名字”訓示了這些對象在記憶體中的位址,也就是在第幾個位元組的位置。python通過讀取這些“名字”就能找到真正的“物體”在哪裡。

是以說你執行append之後,那個清單改變了,但是仍然留在原來的位置,元組裡面的3個箭頭也是指向原來的方向。剛剛也說了這些箭頭才是元組的本體,箭頭沒有變元組就沒有變。是以這裡的“不可變”隻是說箭頭永遠指向那個方向,但那個方向裡面是什麼資訊,就不知道了。

為什麼要搞這麼反人類的設計?這是有理由的。python是動态類型的語言,一個元組裡完全可以放下str int list 三樣東西,但是這就會引進一個問題,那就是不同類型的元素占用的記憶體大小不同,很難管理。

舉個例子,如果python使用的是靜态類型的運作方式,這個時候我輸入

lst=[1,2,3,4] ; lst[2]=“apple”

那麼事情就會變成下面那樣。(我假設數字和字母都是4位元組的)

可以看到,由于apple占用的空間是一個數字的5倍,它不僅占了lst[2]的位置,還把後面的位置都占了,這就很不好。而如果能像C語言 go語言那樣事先确定一個元素就是4個位元組,讓你隻能往裡面寫入整數類型的資料,就能保證不會“殃及”後面的資訊了。(當然這裡隻是打個比方而已)

是以python就利用了計算機上最基礎的“位址”概念。不直接把元素放在清單裡,而是放在别的地方,清單裡隻存儲它們的位址,需要使用的時候通過cpu的“尋址”指令找到對應的資訊。可以看到,不管是apple還是1 2 3,它們的位址資訊都是32位,就不存在殃及後面元素的情況了。js python ruby lua這些動态類型的語言,為了實作動态類型的功能,都是這麼做的。C C++的對象都有類似的想法。

(其實上面的list tuple每個都有2層箭頭,上面隻畫了一層,是為了簡化)