前面我們說過,a=100,然后可以直接把a(bǔ)的內(nèi)存地址,直接給b,再直接給c,這三個(gè)變量都是對(duì)100的直接引用,我們畫個(gè)圖看看。它們都指向了內(nèi)存地址100。
而列表,我們上一章講過是間接引用,我們看看列表,l=[‘a’,’b’,’c’]在內(nèi)存是怎么進(jìn)行存儲(chǔ)的。
如圖所示,列表不會(huì)存放真正的值,它只會(huì)存放索引和值的內(nèi)存地址,而只會(huì)存放單獨(dú)的內(nèi)存空間。最后就是給這個(gè)列表綁定了一個(gè)變量名l,所以我再取l[0]的時(shí)候,是先拿到0號(hào)索引,然后找到值‘a(chǎn)’的內(nèi)存地址,最后把值拿到。
假如我給上面的列表再增加一個(gè)值,l=[‘a’,’b’,’c’,a],注意這個(gè)a沒有添加引號(hào),說明我寫了一個(gè)變量名在這里,然后就相當(dāng)于把a(bǔ)指向的內(nèi)存地址,也就是100放在這里了。
現(xiàn)在你就應(yīng)該明白,為什么叫間接引用。你也可以理解為列表里就是村里一堆目錄,索引對(duì)應(yīng)身份證號(hào),然后我們可以通過目錄里的身份證號(hào)引用到值。
說到這里,你也應(yīng)該明白了字典的儲(chǔ)存方式,列表存到是索引對(duì)應(yīng)值的內(nèi)存地址,那字典自然而然存的key對(duì)應(yīng)值的內(nèi)存地址這就沒什么可說的了。
現(xiàn)在我們看看100這個(gè)引用計(jì)數(shù)是多少,首先被a、b、c這三個(gè)變量名,各自引用了一次,然后被列表l引用了一次,現(xiàn)在我可以這樣說只要能訪問到這個(gè)支的方式都叫一種引用。所以此時(shí),100這個(gè)值的引用計(jì)數(shù)就為4。
當(dāng)一個(gè)值引用計(jì)數(shù)為0的時(shí)候,就會(huì)被垃圾回收機(jī)制回收,也可以這樣說,不能通過變量名直接引用,也不能通過列表或者字典這種容器類型簡(jiǎn)接引用的內(nèi)存空間就會(huì)被垃圾回收機(jī)制回收。
至于垃圾回收機(jī)制底層是怎么運(yùn)行的,這就涉及到三個(gè)概念,一個(gè)就是引用計(jì)數(shù),另一個(gè)是標(biāo)記清除,還有一個(gè)叫分代回收。另外兩個(gè)概念我們后面再講。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python列表在內(nèi)存中的存儲(chǔ)方式