сборка мусора на уровне модуля в python

1

Скажем, у меня есть модуль mod_x, как показано ниже:

class X:
  pass

x=X()

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

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

Теги:
garbage-collection

3 ответа

3
Лучший ответ

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

  • 0
    Спасибо, я так и думал. Это означает, что ошибка, которую я преследую, лежит где-то еще ...
3

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

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню