Из соображений эффективности модуль загружается только один раз за сеанс интерпретатора. Это хорошо для определений функций и классов, которые обычно составляют основную часть содержимого модуля. Но модуль также может содержать исполняемые операторы, обычно для инициализации.
Имейте в виду, что эти инструкции будут выполняться только при первом импорте модуля.
Файл mod.py
:
a = [100, 200, 300] print('a =', a)
>>> import mod a = [100, 200, 300] >>> import mod >>> import mod >>> mod.a [100, 200, 300]
Встроенная функция print()
не выполняется при последующих импортах.
Если в модуль вносятся изменения то модуль нужно перезагружать, что бы изменения вступили в силу. Для этого нужно либо перезапустить интерпретатор, либо использовать функцию importlib.reload()
из модуля importlib
:
>>> import mod a = [100, 200, 300] >>> import mod >>> import importlib >>> importlib.reload(mod) a = [100, 200, 300]
from <module> import <name>
.При импорте с использованием конструкции from <module> import <name>
, <name>
считается частью импорта модуля, поэтому для его перезагрузки необходимо перезагрузить сам модуль <module>
. Но просто перезагружая модуль <module>
, вы все равно получите старый <name>
- из уже ранее импортированного <module>
, поэтому нужно при перезагрузки модуля <module>
нужно обновить значение <name>
, используя конструкцию ниже:
from <module> import <name> # перезагрузка <name> модуля <module> import importlib, sys name = importlib.reload(sys.modules['module']).name