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 SysSys.getrefcount (obj)
# Comment résoudre les problèmes de gestion de mémoire ?
#!/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 >>>>>')
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!