Ответ 1
В общем:
- Каждый объект привязки переменной → увеличивает внутренний счетчик ссылок на объект
-
существует несколько обычных способов уменьшения ссылки (объект разыменования → привязка переменных):
- выход из блока кода, где была объявлена переменная (используется в первый раз)
- разрушающий объект освободит ссылки всех атрибутов/переменных метода → ссылки на объекты
- вызов
del variable
также удалит ссылку в текущем контексте
-
после удаления всех ссылок на один объект (counter == 0) он становится хорошим кандидатом на сборку мусора, но не гарантируется, что он будет обработан (ссылка здесь):
В настоящее время CPython использует схему подсчета ссылок с (необязательно) отсроченное обнаружение циклически связанного мусора, который собирает большинство объектов, как только они становятся недоступными, но не гарантируется собирать мусор, содержащий круглые ссылки. См. Документацию модуля gc для информации об управлении сбором циклический мусор. Другие реализации действуют по-разному, и CPython может изменение. Не зависеть от непосредственной доработки объектов, когда они становятся недоступными (например: всегда закрывать файлы).
-
сколько ссылок на объект существует, используйте sys.getrefcount
-
модуль для сбора/очистки мусора configure gc
-
GC уничтожит объект object.__ del__, когда уничтожает объект (дополнительная ссылка здесь)
-
некоторые неизменяемые объекты, такие как строки, обрабатываются особым образом - например, если два vars содержат одну и ту же строку, возможно, что они ссылаются на один и тот же объект, но некоторые не проверяют идентифицирующие объекты, почему возвращается возвращаемое значение из id (...)?
-
id объекта можно найти со встроенной функцией id
-
модуль memory_profiler выглядит интересным - модуль для мониторинга использования памяти программы python
-
есть много полезных ресурсов для этой темы, один пример: Найти все ссылки на объект в python