Maison >développement back-end >Tutoriel Python >Comment Python gère la mémoire dans les références circulaires

Comment Python gère la mémoire dans les références circulaires

小云云
小云云original
2018-03-29 14:15:212613parcourir

En python, les objets poubelles sont recyclés grâce au comptage de références. Dans certaines structures de données circulaires (arbres, graphiques...), il existe des références circulaires entre les objets. Par exemple, le nœud parent de l'arbre fait référence au nœud enfant, et le nœud enfant fait également référence au nœud parent. À ce stade, en supprimant la référence aux nœuds parent et enfant, les deux objets ne peuvent pas être libérés immédiatement.

Exigences :

Comment résoudre ce genre de problème de gestion de la mémoire ?

Comment interroger le nombre de références d'un objet ?

Import Sys

Sys.getrefcount (obj)

#

Comment résoudre les problèmes de gestion de mémoire ?

    Faire une référence faible via faibleref. Lorsque del, ne fait plus référence, ajoutez faibleref.ref (référence obj) du côté référencement ; >
  • Lors de l'utilisation de références, vous devez utiliser la forme d'appels de fonction

Recommandations associées :


#!/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 >>>>>')
Introduction à l'utilisation de la fonction de gestion de la mémoire PHP memory_get_usage()_PHP tutoriel


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn