Что произойдет, если импортировать модуль дважды?

При первом импорте модуль будет выполнен и его объекты добавлены в текущее пространство имен. При последующих импортах модуль не будет выполнен повторно. Python использует кэш модулей. Просто будет возвращена ссылка на уже существующий модуль.

Если модуль импортируется в Python дважды, фактически он будет загружен и выполнен только один раз за время жизни текущего интерпретатора Python. Python использует внутренний механизм для отслеживания уже импортированных модулей.

Когда вы делаете import module_name:

  1. Python сначала проверяет sys.modules. sys.modules это словарь, который хранит все уже импортированные модули.
  2. Если модуль с именем module_name уже находится в sys.modules, Python просто возвращает ссылку на существующий модуль, избегая повторной загрузки и выполнения кода модуля.
  3. Если модуль отсутствует в sys.modules, Python выполняет следующие действия:
    • Находит файл module_name.py (или его скомпилированную версию module_name.pyc или module_name.pyo) в директориях, указанных в sys.path.
    • Выполняет код в файле модуля.
    • Добавляет модуль в sys.modules с ключом 'module_name'.
    • Возвращает ссылку на только что созданный модуль.

Важно отметить: Даже если код модуля выполняется только один раз, при каждом импорте создается новое имя в текущем пространстве имен, указывающее на тот же самый объект модуля. То есть, если у вас есть несколько файлов, импортирующих один и тот же модуль, каждый файл получит свое собственное имя, ссылающееся на единственный экземпляр модуля в памяти.

Пример:

    
    # module_a.py
    print("Модуль A загружен")
    variable_a = 10
    
  
    
    # main.py
    import module_a
    import module_a

    print(module_a.variable_a) # Выведет 10
    
  

В данном примере "Модуль A загружен" будет напечатано только один раз, даже несмотря на то, что import module_a вызывается дважды.

Последствия:

  • Эффективность: Предотвращает ненужные повторные вычисления и снижает потребление памяти.
  • Глобальное состояние: Модули, как правило, имеют глобальное состояние. Это состояние инициализируется только при первом импорте. Последующие импорты не переинициализируют глобальное состояние. Это может быть как полезно (для хранения общих данных), так и опасно (если вы рассчитываете, что состояние будет сброшено при каждом импорте).
0