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

