65 lines
1.9 KiB
Markdown
65 lines
1.9 KiB
Markdown
---
|
||
aliases:
|
||
- références cycliques
|
||
---
|
||
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 :
|
||
```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 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.
|
||
|
||
```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 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.
|
||
|
||
|