Есть ли в Python переменные на основе стека? - PullRequest
5 голосов
/ 24 июня 2009

Если я сделаю это:

def foo():
     a = SomeObject()

'a' уничтожается сразу после ухода из foo? Или это ждет какого-то GC?

1 Ответ

18 голосов
/ 24 июня 2009

Да и нет. Объект будет уничтожен после того, как вы покинете foo (при условии, что ничто иное не имеет ссылки на него), но то, является ли он непосредственным или нет, является деталью реализации и будет различаться.

В CPython (стандартная реализация python) используется пересчет, поэтому элемент будет немедленно уничтожен. Есть некоторые исключения из этого, например, когда объект содержит циклические ссылки, или когда ссылки содержатся на охватывающем фрейме (например, возникает исключение, которое сохраняет ссылку на переменные фрейма.)

Однако в таких имплиментах, как Jython или IronPython, объект не будет завершен, пока не будет запущен сборщик мусора.

Таким образом, вы не должны полагаться на своевременное завершение объектов, а должны только предполагать, что они будут уничтожены в какой-то момент после того, как пойдет последняя ссылка. Когда вам нужно выполнить очистку на основе лексической области, либо явно вызовите метод очистки, либо посмотрите на новый с оператором в python 2.6 (доступен в 2.5 с "from __future__ import with_statement").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...