1.9 KiB
aliases
aliases | |
---|---|
|
up:: python source:: Variables, scopes et closures en Python - Bibliothèque - Zeste de Savoir #informatique/python :
Normalement, lorsque toutes les références à un objet sont supprimées, sa méthode __del__
est appelée, puis il est supprimé de la mémoire :
>>> class Obj:
... def __del__(self):
... print('deleting', self)
...
>>> value = Obj()
>>> l = [value]
>>> d = {'key': value}
>>>
>>> del value
>>> del l[0]
>>> del d['key']
deleting <__main__.Obj object at 0x7f33ade3fba8>
Cependant, si on utilise des références cycliques, le méchanisme de garbage collection ne fonctionne pas :
>>> obj1 = Obj()
>>> obj2 = Obj()
>>> obj1.ref = obj2
>>> obj2.ref = obj1
>>>
>>> del obj1
>>> del obj2
La garbage collection ne vide la mémoire qu'a la fin du processus python :
>>> ^D
deleting <__main__.Obj object at 0x7f8fcf561b70>
deleting <__main__.Obj object at 0x7f8fcf561ba8>
Il peut néanmoins être gênant de devoir attendre la fin du programme pour collecter ces valeurs (elles occupent inutilement de l’espace mémoire obligeant ainsi le programme à en allouer toujours plus), et dans ce genre de cas il est utile de pouvoir invoquer manuellement le ramasse-miettes. Cela se fait à l’aide la méthode collect
du module gc
, qui renvoie le nombre de valeurs non atteignables trouvées et supprimées.
>>> obj1 = Obj()
>>> obj2 = Obj()
>>> obj1.ref = obj2
>>> obj2.ref = obj1
>>>
>>> del obj1
>>> del obj2
>>>
>>> import gc
>>> gc.collect()
deleting <__main__.Obj object at 0x7f4077157b70>
deleting <__main__.Obj object at 0x7f4077157be0>
4
Les références cycliques sont assez courantes lorsqu’on travaille sur des représentations arborescentes et que l’on souhaite que les nœuds parents et enfants puissent se référencer. C’est aussi le cas pour la gestion de données sous forme de graphes.