Ручная сборка мусора в Python

Есть ли способ вручную удалить объект, который сбор мусора отказывается избавиться даже после вызова gc.collect()? Работа в Python 3.0

Ответы

Ответ 1

Per документы, gc.get_referrers(thatobject) расскажет вам, почему объект все еще жив (сделайте это сразу после gc.collect(), чтобы убедиться нежелательная "живучесть" будет настойчивой). После этого это как-то черное искусство;-). Вы часто обнаружите, что некоторые из рефереров являются списками (поэтому ПОЧЕМУ этот список относится к thatobject? Вы можете .remove его в аварийном режиме, но лучше сделать нормальный звук кода...) и, все чаще, dict (многие из которых могут быть __dict__ какого-либо экземпляра класса или другого, часто не являются тривиальными, чтобы выяснить, какой из них... снова, удаление грубой силы иногда является целесообразным экстренным решением, но никогда устойчивый долгосрочный! -).

Ответ 2

Если GC отказывается уничтожить его, это потому, что у вас есть ссылка на него где-то. Избавьтесь от ссылки, и она (в конце концов) уйдет. Например:

myRef = None

Имейте в виду, что GC может не обязательно уничтожать ваш объект, если это не нужно.

Если ваш объект хранит ресурсы не под управлением Python (например, некоторые обманки с кодом C, вызываемым из Python), объект должен предоставлять вызов для выпуска ресурса, чтобы вы могли делать это, когда хотите, а не когда Python решает.

Ответ 3

del Или None являются вашими друзьями

>>> a = "Hello"
>>> a = None
Or
>>> del a

Ответ 4

Это зависит от того, что работает ваш Python. Здесь хорошая статья, которая объясняет детали

Цитирование:

В текущих выпусках CPython каждое новое назначение x внутри цикла освободит ранее выделенный ресурс. Используя GC, это не гарантируется. Если вы хотите написать код, который будет работать с любой реализацией Python, вы должны явно закрыть ресурс; это будет работать независимо от GC:

for name in big_list:
    x = Resource()
    do something with x
    x.close()