python如何在循環(huán)引用中管理內(nèi)存
python中通過引用計(jì)數(shù)來回收垃圾對(duì)象,在某些環(huán)形數(shù)據(jù)結(jié)構(gòu)(樹,圖……),存在對(duì)象間的循環(huán)引用,比如樹的父節(jié)點(diǎn)引用子節(jié)點(diǎn),子節(jié)點(diǎn)同時(shí)引用父節(jié)點(diǎn),此時(shí)通過del掉引用父子節(jié)點(diǎn),兩個(gè)對(duì)象不能被立即釋放
需求:
如何解決此類的內(nèi)存管理問題?
如何查詢一個(gè)對(duì)象的引用計(jì)數(shù)?
import sys
sys.getrefcount(obj)
# 查詢引用計(jì)數(shù)必多 1 ,因?yàn)閛bject也引用 查詢對(duì)象
如何解決內(nèi)存管理問題?
- 通過weakref,進(jìn)行弱引用,當(dāng)del時(shí)候,不再引用,在引用方添加weakref.ref(引用obj);
- 使用引用的時(shí)候,需要用到函數(shù)調(diào)用的形式
#!/usr/bin/python3
import weakref
import sys
class Data(object):
def __init__(self, value, owner):
self.value = value
# 聲明弱引用,owner為Node類本身
self.owner = weakref.ref(owner)
# 通過函數(shù)調(diào)用的方式訪問引用對(duì)象
def __str__(self):
return "%s's data, value is %s" % (self.owner(), self.value)
def __del__(self):
print('in_data.__del__')
class Node(object):
def __init__(self, value):
# 把類本身,也當(dāng)做參數(shù)傳入Data類中
self.data = Data(value, self)
# 自定義對(duì)象名,容易辨認(rèn)
def __str__(self):
return 'Node'
def __del__(self):
print('in_node.__del__')
if __name__ == '__main__':
node = Node(100)
print(node.data)
# 打印node對(duì)象的引用計(jì)數(shù)
print(sys.getrefcount(node) - 1)
# 當(dāng)刪除node對(duì)象時(shí)候,Data實(shí)例對(duì)象在引用計(jì)算為0也相應(yīng)釋放
del node
input('del done >>>>>')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
5個(gè)Python使用F-String進(jìn)行格式化的實(shí)用技巧分享
F-String(格式化字符串字面值)是在Python?3.6中引入的,它是一種非常強(qiáng)大且靈活的字符串格式化方法,本文總結(jié)了5個(gè)實(shí)用的F-String技巧,相信一定能讓你的代碼輸出更加的美觀,快跟隨小編一起學(xué)習(xí)起來吧2024-03-03
詳解使用Selenium爬取豆瓣電影前100的愛情片相關(guān)信息
這篇文章主要介紹了詳解使用Selenium爬取豆瓣電影前100的愛情片相關(guān)信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python 實(shí)現(xiàn)自動(dòng)完成A4標(biāo)簽排版打印功能
這篇文章主要介紹了Python 實(shí)現(xiàn)自動(dòng)完成A4標(biāo)簽排版打印功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
基于Python創(chuàng)建可定制的HTTP服務(wù)器
這篇文章主要為大家演示一下如何使用?http.server?模塊來實(shí)現(xiàn)一個(gè)能夠發(fā)布網(wǎng)頁的應(yīng)用服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05
Python導(dǎo)入數(shù)值型Excel數(shù)據(jù)并生成矩陣操作
這篇文章主要介紹了Python導(dǎo)入數(shù)值型Excel數(shù)據(jù)并生成矩陣操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python?遞歸式實(shí)現(xiàn)二叉樹前序,中序,后序遍歷
這篇文章主要介紹了Python?遞歸式實(shí)現(xiàn)二叉樹前序,中序,后序遍歷,更多相關(guān)資料,需要的小伙伴可以參考下面具體的文章內(nèi)容2022-03-03
Python異常處理如何才能寫得優(yōu)雅(retrying模塊)
異常就是程序運(yùn)行時(shí)發(fā)生錯(cuò)誤的信號(hào),下面這篇文章主要給大家介紹了關(guān)于Python異常處理的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03

