Скажем, у меня есть модуль mod_x
, как показано ниже:
class X:
pass
x=X()
Теперь, скажем, у меня есть еще один модуль, который просто выполняет import mod_x
, и идет о его бизнесе. Модульная переменная x
больше не будет ссылаться в течение жизненного цикла интерпретатора.
Будет ли экземпляр класса x
получать мусор, собранный в любой момент кроме при окончании интерпретатора?
Нет, переменная никогда не получит сбор мусора (до конца процесса), потому что объект модуля останется в sys.modules['mod_x']
, и у него будет ссылка на mod_x.x
- счетчик ссылок никогда не упадет до 0 (пока все модули не будут удалены в конце программы), и это не проблема "циклического мусора" - это совершенно правильная живая ссылка и доказательство того, что никто не делает (например) getattr(sys.modules[a], b)
, где строковые переменные a
и b
могут стоить 'mod_x'
и 'x'
соответственно, по крайней мере, так же сложно, как решить проблему остановки;-). ( "По крайней мере", так как больше кода может быть динамически загружено в любое время...! -).
Только если что-то еще выполняет del mod_x.x
или переподключение в какой-то момент, или если сам модуль полностью удаляется.
Как только модуль будет импортирован, он будет находиться в sys.modules
dict, поэтому, если он не будет удален (это возможно, хотя это не стандартная практика), он не будет собирать мусор.
Итак, если у вас есть причина для того, чтобы модуль, который был загружен для сбора мусора, вам нужно возиться с sys.modules
.