Вопрос объясняет разницу между слабыми (weakref) и сильными ссылками, а также их применение.
Сильная ссылка увеличивает счётчик ссылок объекта и предотвращает его удаление.
Слабая ссылка не влияет на счётчик, поэтому объект может быть удалён сборщиком мусора. Используется для кэшей и обработчиков событий.
1. Сильная ссылка:
Обычное присваивание (a = [1, 2]).
Пока есть хотя бы одна сильная ссылка, объект не удаляется.
2. Слабая ссылка (weakref):
Не увеличивает счётчик ссылок.
Если объект удалён, слабая ссылка становится "мёртвой".
Пример:
import weakref
class Node:
pass
node = Node()
strong_ref = node
weak_ref = weakref.ref(node)
print(weak_ref()) # <__main__.Node object>
del node
print(weak_ref()) # None (объект удалён) Где использовать:
Кэширование (чтобы не удерживать ненужные объекты в памяти).
Обработчики событий (избегание "утечек" памяти).
Вывод:
Слабые ссылки полезны для оптимизации памяти в долгоживущих приложениях.