update
This commit is contained in:
34
python références faibles.md
Normal file
34
python références faibles.md
Normal file
@@ -0,0 +1,34 @@
|
||||
source:: [[Variables, scopes et closures en Python - Bibliothèque - Zeste de Savoir]]
|
||||
#informatique/python
|
||||
|
||||
Une solution possible pour libérer la mémoire malgré les [[python références cycliques|références cycliques]].
|
||||
|
||||
Le problème des références cycliques provient du fait que le ramasse-miettes ne peut collecter les objets tant qu’ils sont référencés. Une autre manière de le résoudre est alors d’utiliser des références qui n’empêchent pas ce ramasse-miettes de supprimer les valeurs. On les appelle « références faibles » et elles sont fournies en Python par le module [weakref](https://docs.python.org/3/library/weakref.html).
|
||||
|
||||
Une référence faible est similaire à un appel de fonction qui renvoie l’objet si celui-ci est toujours référencé, ou `None` s’il a été supprimé.
|
||||
|
||||
```python
|
||||
>>> import weakref
|
||||
>>>
|
||||
>>> class Obj:
|
||||
... def __del__(self):
|
||||
... print('deleting', self)
|
||||
...
|
||||
>>>
|
||||
>>> obj1 = Obj()
|
||||
>>> obj2 = Obj()
|
||||
>>> obj1.ref = obj2
|
||||
>>> obj2.ref = weakref.ref(obj1)
|
||||
>>>
|
||||
>>> obj2.ref
|
||||
<weakref at 0x7f8de5d69408; to 'Obj' at 0x7f8de5d6b128>
|
||||
>>> print(obj2.ref())
|
||||
<__main__.Obj object at 0x7f8de5d6b128>
|
||||
>>> obj2.ref() is obj1
|
||||
True
|
||||
>>>
|
||||
>>> del obj1
|
||||
deleting <__main__.Obj object at 0x7f8de5d6b128>
|
||||
>>> print(obj2.ref())
|
||||
None
|
||||
```
|
Reference in New Issue
Block a user