В Python управление памятью в основном держится на подсчёте ссылок: объект живёт, пока на него есть хотя бы одна сильная ссылка. В большинстве случаев это работает прозрачно, но есть коварные сценарии — циклические ссылки, кэши и списки подписчиков — где объекты начинают жить дольше, чем нужно.
Да, в CPython есть GC, который умеет разрывать циклы. Но он запускается не сразу, работает не бесплатно и не спасает от логических утечек, когда вы сами «держите» объект через кэш или реестр.
Здесь на сцену выходят слабые ссылки (
weakref). Они позволяют ссылаться на объект, не продлевая его жизнь. Как только пропадают сильные ссылки — объект удаляется, даже если на него кто-то «смотрит» через weakref.На практике это даёт несколько очень полезных паттернов:
— автоочищающиеся кэши через
WeakValueDictionary— реестры и singleton-подобные структуры, которые не держат объекты насильно
— списки подписчиков (`WeakSet`), где не нужно вручную отписывать «умершие» объекты
— аккуратную работу с долгоживущими менеджерами и короткоживущими сущностями
Отдельный бонус — callbacks у
weakref: можно повесить логику очистки, которая сработает ровно в момент сборки объекта.📚 Подробнее в нашей новой статье на Хабре.
@python_for_devs