Python が循環参照でメモリを管理する方法

小云云
リリース: 2018-03-29 14:15:21
オリジナル
2582 人が閲覧しました

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 >>>>>')
    ログイン後にコピー
  • 関連する推奨事項:


PHP メモリ管理関数の使用方法の概要memory_get_usage()_PHP チュートリアル


以上がPython が循環参照でメモリを管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート