Python では、不要なオブジェクトは参照カウントによってリサイクルされます。たとえば、ツリーの親ノードは子ノードを参照し、オブジェクト間には循環参照があります。このとき、子ノードも親ノードを参照します。親ノードと子ノードへの参照を削除しても、2 つのオブジェクトはすぐには解放されません。
要件:
この種のメモリ管理問題を解決するにはどうすればよいですか?
オブジェクトの参照カウントをクエリするにはどうすればよいですか?
Getrefcount (obj)
Getrefcount の参照カウント。
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 が循環参照でメモリを管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。