cours/python références cycliques.md
Oscar Plaisant 602a41e7f8 update
2024-12-25 22:30:24 +01:00

65 lines
1.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- références cycliques
---
up:: [[python]]
source:: [[Variables, scopes et closures en Python - Bibliothèque - Zeste de Savoir]]
#s/informatique/langage/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 :
```python
>>> 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 :
```python
>>> 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 :
```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 lespace 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 à laide la méthode `collect` du module `gc`, qui renvoie le nombre de valeurs non atteignables trouvées et supprimées.
```python
>>> 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 lorsquon travaille sur des représentations arborescentes et que lon souhaite que les nœuds parents et enfants puissent se référencer. Cest aussi le cas pour la gestion de données sous forme de graphes.