This commit is contained in:
Oscar Plaisant
2024-05-14 10:51:40 +02:00
parent f71d6b0503
commit 66c143b7b3
164 changed files with 25026 additions and 13829 deletions

View File

@@ -0,0 +1,64 @@
---
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 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.