В ожидании завершения работы долго работающей функции я начал думать о том, удалит ли сборщик мусора ссылки на переменные, которые больше не будут использоваться.
Скажем, например, у меня есть такая функция:
def long_running_function():
x = MemoryIntensiveObject()
print id(x)
# lots of hard work done here which does not reference x
return
Я заинтригован, достаточно ли толковат интерпретатор, чтобы понять, что x больше не используется и может быть разыменован.Это довольно сложно протестировать, так как я могу написать код, чтобы проверить его счетчик ссылок, но затем он косвенно ссылается на него, что устраняет причину этого.
Я думаю, что, возможно, когда функция анализируется и генерируется байт-код, она может быть сгенерирована таким образом, чтобы она могла очистить объект, когда на него больше нельзя ссылаться.
Или ответ проще: если мы все еще находимся в области, где он "может" использоваться, он не будет очищен?