TL; DR: import
загружает каждый модуль только один раз за сеанс интерпретатора. Однако основной модуль отличается тем, что его можно импортировать в двух вариантах.
Оператор import
отвечает за две вещи:
- загрузка целевого модуля в интерпретатор и
- связывание модуля или его имени в текущей области.
Примечательно, если модуль уже был загружен (он находится в sys.modules
) , модуль не снова загружается. В этом случае происходит только привязка имени.
Вот почему рекурсивный импорт модуля не приводит к бесконечному повторному запуску его кода.
Главный модуль, т.е. начальный запуск модуля отличается тем, что он может регулярно существовать в двух вариантах:
- с именем
__main__
, устанавливается автоматически при запуске модуля, и - со своим собственным имя, такое как
test
, устанавливается автоматически при импорте модуля.
Примечательно, что эти две версии не идентичны. Каждый модуль с защитой if __name__ == "__main__":
запускает другой код и, таким образом, достигает другого состояния.
Вот почему модуль __main__
может быть загружен дважды, один раз под именем __main__
и один раз под собственным именем.
Для этого кода в спецификации c последовательность выглядит так:
- Выполнение
python3 test.py
устанавливает test.py
для импорта как __main__
. - Модуля
__main__
пока нет. Python выполняет test.py
для создания модуля. functionA
и functionB
определены, print("t1")
вызывается , functionA
вызывается, import test
запущено, - Модуля
test
пока нет. Python выполняет test.py
для создания модуля. functionA
и functionB
определены, print("t1")
вызывается , functionA
вызывается, import test
запущен, - Модуль
test
уже существует (хотя и не полностью). - Python связывает модуль
test
с именем test
.
print("a1")
называется ,
print("m1")
называется ,
print("a1")
называется ,
print("m1")
называется ,