python如何在循環(huán)引用中管理內存
更新時間:2018年03月20日 15:21:34 作者:北門吹雪
這篇文章主要為大家詳細介紹了python如何在循環(huán)引用中管理內存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
python中通過引用計數來回收垃圾對象,在某些環(huán)形數據結構(樹,圖……),存在對象間的循環(huán)引用,比如樹的父節(jié)點引用子節(jié)點,子節(jié)點同時引用父節(jié)點,此時通過del掉引用父子節(jié)點,兩個對象不能被立即釋放
需求:
如何解決此類的內存管理問題?
如何查詢一個對象的引用計數?
import sys
sys.getrefcount(obj)
# 查詢引用計數必多 1 ,因為object也引用 查詢對象
如何解決內存管理問題?
- 通過weakref,進行弱引用,當del時候,不再引用,在引用方添加weakref.ref(引用obj);
- 使用引用的時候,需要用到函數調用的形式
#!/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) # 通過函數調用的方式訪問引用對象 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): # 把類本身,也當做參數傳入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對象的引用計數 print(sys.getrefcount(node) - 1) # 當刪除node對象時候,Data實例對象在引用計算為0也相應釋放 del node input('del done >>>>>')
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
在Python中使用MySQL--PyMySQL的基本使用方法
PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。這篇文章主要介紹了在Python中使用MySQL--PyMySQL的基本使用,需要的朋友可以參考下2019-11-11Django項目創(chuàng)建到啟動詳解(最全最詳細)
這篇文章主要給大家介紹了關于Django項目創(chuàng)建到啟動的步驟,本文介紹的方法算是最全最詳細的一個項目,需要的朋友可以參考下2019-09-09