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