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