сборка мусора на уровне модуля в python - PullRequest
1 голос
/ 19 января 2010

Допустим, у меня есть модуль mod_x, подобный следующему:

class X:
  pass

x=X()

Теперь, допустим, у меня есть другой модуль, который просто выполняет import mod_x и занимается своим делом.Переменная модуля x больше не будет использоваться в течение жизненного цикла интерпретатора.

Будет ли экземпляр класса x собирать мусор в любой точке , за исключением при завершении интерпретатора?

Ответы [ 3 ]

3 голосов
/ 19 января 2010

Нет, переменная никогда не получит сборщик мусора (до конца процесса), потому что объект модуля останется в sys.modules['mod_x'] и будет иметь ссылку на mod_x.x - счетчик ссылок никогда не упадетдо 0 (пока все модули не будут удалены в конце программы), и это не проблема «циклического мусора» - это совершенно допустимая реальная ссылка и доказательство того, что никто не делает (например) getattr(sys.modules[a], b) где строковые переменныеa и b, соответственно, стоят 'mod_x' и 'x' соответственно, по крайней мере так же сложно, как решить проблему остановки ;-).(«По крайней мере», поскольку в любой момент может быть динамически загружено больше кода ...! -).

3 голосов
/ 19 января 2010

Только если что-то еще делает del mod_x.x или повторное связывание в какой-то момент или если сам модуль полностью удаляется.

1 голос
/ 19 января 2010

После того, как модуль импортирован, он будет указан в sys.modules, поэтому, если он не будет удален оттуда (что возможно, хотя и не является стандартной практикой), он не будет собирать мусор.

Так что если у вас есть причина, по которой вы хотите, чтобы модуль, который был загружен, собирался мусором, вы должны связываться с sys.modules.

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