摘要:第一次初始化對象,并且用變量來引用,所以這里的引用計數(shù)就為。接下來通過創(chuàng)建一個弱引用,通過打印引用計數(shù)后,發(fā)現(xiàn)計數(shù)并沒有改變。由于一次僅能有一個對象被回收,引用計數(shù)無法回收循環(huán)引用的對象。所以弱引用很適合處理這種循環(huán)引用的場景。
寫在前邊:
之前的socket系列就告一段落,主要是對自己所學(xué)做一個總結(jié)與記錄。
接下來我打算基于libevent寫一個支持并發(fā)的HTTP服務(wù)器。因為之前學(xué)習(xí)群里大神早就開發(fā)過一個同時支持HTTP與WebSocket的服務(wù)器,我看了之后感覺很有興趣,所以才買了本網(wǎng)絡(luò)編程的書來看。我打算參考他的來寫一個精簡版,
只支持HTTP。等寫完了可以分享給大家,雖然不能運用到生產(chǎn)環(huán)境,但是我相信學(xué)習(xí)完源碼之后對于自己也是一個極大的提升。
接下來進(jìn)入主題:
先放上實例代碼:
我們創(chuàng)建一個用于測試的x對象,包括一個構(gòu)造函數(shù)和一個析構(gòu)函數(shù)。
第一次初始化x對象,并且用變量a來引用,所以這里的引用計數(shù)就為1。之后通過 getrefcount 來獲取引用數(shù)量,這里變?yōu)榱?,因為調(diào)用函數(shù) getrefcount 本身也是對a的一次引用。
接下來通過 weakref.ref() 創(chuàng)建一個弱引用,通過 getrefcount 打印引用計數(shù)后,發(fā)現(xiàn)計數(shù)并沒有改變。
w() is a 這句的意思是判斷這兩個實例是不是完全相同,也就是占用的內(nèi)存地址是否相同。
然后我們通過 del a 來解除a對x對象的引用,注意這里del并不是直接回收x對象,而是解除了引用,我們知道一旦一個變量的引用為0的時候就會被回收。所以調(diào)用del之后x對象被回收。
通過之前的代碼我們看到,調(diào)用弱引用的方式為類函數(shù)的方式。不過可以使用proxy來改為使用變量名的方式調(diào)用。
到這里我相信對于弱引用的使用方式肯定都掌握了。但是弱引用到底有什么作用呢?
與很多其它的高級語言一樣,Python也有垃圾回收機制。每個對象都有一個引用計數(shù),當(dāng)這個計數(shù)為0的時候才能夠安全地銷毀這個對象。
由于一次僅能有一個對象被回收,引用計數(shù)無法回收循環(huán)引用的對象。一組相互引用的對象若沒有被其它對象直接引用,并且不可訪問,則會永久存活下來。
一個應(yīng)用程序如果持續(xù)地產(chǎn)生這種不可訪問的對象群組,就會發(fā)生內(nèi)存泄漏。
所以弱引用很適合處理這種循環(huán)引用的場景。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42455.html
摘要:內(nèi)部通過引用計數(shù)機制來統(tǒng)計一個對象被引用的次數(shù)。下一步,就該被我們的垃圾回收器給收走了。而我們垃圾回收機制只有當(dāng)引用計數(shù)為的時候才會釋放對象。以空間換時間的方法提高垃圾回收效率。 人生苦短,只談風(fēng)月,談什么垃圾回收。據(jù)說上圖是某語言的垃圾回收機制。。。我們寫過C語言、C++的朋友都知道,我們的C語言是沒有垃圾回...
摘要:里,有兩種方法獲得一定范圍內(nèi)的數(shù)字返回一個列表,還有返回一個迭代器。在引用計數(shù)的基礎(chǔ)上,還可以通過標(biāo)記清除解決容器對象可能產(chǎn)生的循環(huán)引用的問題。列舉常見的內(nèi)置函數(shù)的作用,過濾函數(shù),循環(huán)函數(shù)累積函數(shù)一行代碼實現(xiàn)乘法表。 showImg(https://segmentfault.com/img/remote/1460000019294205); 1、為什么學(xué)習(xí)Python? 人生苦短?人間...
摘要:所以,應(yīng)該直接了當(dāng)?shù)陌惭b,其中也會自動安裝上,作為其運行的。這只是一開始,之后還有里各種找不到外部安裝的的情況。終于,意識到這些方法都是錯誤的思路。這才知道原來是無法識別。 為什么要用IPython/Jupyter? python里面調(diào)試確實有點煩惱,尤其是在vim里,想要嘗試一些簡單的編碼問題,實在是有點麻煩,不想到命令行模式一行一行執(zhí)行,也不想再新建一個文件測試一個簡單的功能。 而...
摘要:所以,應(yīng)該直接了當(dāng)?shù)陌惭b,其中也會自動安裝上,作為其運行的。這只是一開始,之后還有里各種找不到外部安裝的的情況。終于,意識到這些方法都是錯誤的思路。這才知道原來是無法識別。 為什么要用IPython/Jupyter? python里面調(diào)試確實有點煩惱,尤其是在vim里,想要嘗試一些簡單的編碼問題,實在是有點麻煩,不想到命令行模式一行一行執(zhí)行,也不想再新建一個文件測試一個簡單的功能。 而...
閱讀 2420·2021-09-22 15:15
閱讀 657·2021-09-02 15:11
閱讀 1799·2021-08-30 09:48
閱讀 1899·2019-08-30 15:56
閱讀 1508·2019-08-30 15:52
閱讀 2060·2019-08-30 15:44
閱讀 447·2019-08-29 16:29
閱讀 1552·2019-08-29 11:06