python中透過引用計數來回收垃圾對象,在某些環形資料結構(樹,圖…),存在對象間的循環引用,例如樹的父節點引用子節點,子節點同時引用父節點,此時透過del掉引用父子節點,兩個物件不能被立即釋放。
需求:
如何解決此類的記憶體管理問題?
如何查詢一個物件的參考計數?
import sys
# sys.getrefcount(obj)
# 查詢數必須多1)
##如何解決記憶體管理問題?
透過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 >>>>>')
相關推薦:
#PHP管理記憶體函數memory_get_usage()使用介紹_PHP教學
#
以上是python在循環引用中如何管理內存的詳細內容。更多資訊請關注PHP中文網其他相關文章!