python在循環引用中如何管理內存

小云云
發布: 2018-03-29 14:15:21
原創
2577 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板