35 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| source:: [[Variables, scopes et closures en Python - Bibliothèque - Zeste de Savoir]]
 | ||
| #s/informatique/langage/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
 | ||
| ```
 |