Один из самых первых вопросов возникающий у начинающих программистов - это почему операция импорта перестает работать?
Они сообщают, что при первой попытке импортировать модуль все работает, а при второй и последующих попытках нет должного эффекта. Это происходит по следующим причинам .....
Модули загружаются и запускаются первой, и только первой инструкцией import или from. Реализовано такое поведение преднамеренно, потому что импортирование – это дорогостоящая операция и интерпретатор выполняет ее всего один раз за все время работы. Последующие операции импорта просто получают объект уже загруженного модуля.
Из этого следует: так как программный код на верхнем уровне модуля выполняется всего один раз, это обстоятельство можно использовать для инициализации переменных.
Рассмотрим пример модуля simple.py:
Print(‘hello’)
spam = 1 # Инициализировать переменную
В этом примере инструкции print и = выполняются, когда модуль импортируется впервые, и переменная spam инициализируется во время импортирования:
% python
>>> import simple # Первая инструкция import: загружает и запускает код модуля
hello
>>> simple.spam # Операция присваивания создает атрибут
1
Вторая и все последующие операции импортирования не приводят к перезапуску программного кода модуля – они просто получают объект модуля из внутренней таблицы модулей интерпретатора. В результате повторная инициализация переменной spam не происходит:
>>> simple.spam = 2 # Изменить атрибут модуля
>>> import simple # Просто получает уже загруженный модуль
>>> simple.spam # Код не перезапускается: атрибут не изменился
2
Конечно, иногда действительно бывает необходимо перезапустить программный код модуля при повторных операциях импортирования. Позднее в этой главе мы увидим, как это можно сделать с помощью функции reload.
Они сообщают, что при первой попытке импортировать модуль все работает, а при второй и последующих попытках нет должного эффекта. Это происходит по следующим причинам .....
Модули загружаются и запускаются первой, и только первой инструкцией import или from. Реализовано такое поведение преднамеренно, потому что импортирование – это дорогостоящая операция и интерпретатор выполняет ее всего один раз за все время работы. Последующие операции импорта просто получают объект уже загруженного модуля.
Из этого следует: так как программный код на верхнем уровне модуля выполняется всего один раз, это обстоятельство можно использовать для инициализации переменных.
Рассмотрим пример модуля simple.py:
Print(‘hello’)
spam = 1 # Инициализировать переменную
В этом примере инструкции print и = выполняются, когда модуль импортируется впервые, и переменная spam инициализируется во время импортирования:
% python
>>> import simple # Первая инструкция import: загружает и запускает код модуля
hello
>>> simple.spam # Операция присваивания создает атрибут
1
Вторая и все последующие операции импортирования не приводят к перезапуску программного кода модуля – они просто получают объект модуля из внутренней таблицы модулей интерпретатора. В результате повторная инициализация переменной spam не происходит:
>>> simple.spam = 2 # Изменить атрибут модуля
>>> import simple # Просто получает уже загруженный модуль
>>> simple.spam # Код не перезапускается: атрибут не изменился
2
Конечно, иногда действительно бывает необходимо перезапустить программный код модуля при повторных операциях импортирования. Позднее в этой главе мы увидим, как это можно сделать с помощью функции reload.
Комментариев нет:
Отправить комментарий