Резюме:
В зависимости от того, как определена функция - локально или в модуле, и от того, как модуль импортирован, - область действия глобальных переменных различается. i) я хотел бы понять это и ii) я ищу способ, чтобы область действия некоторых переменных, определенных в модуле, была глобальной для всего процесса.
Для иллюстрации проблемы:
1) Создайте модуль с именем MyModule.py с таким содержимым:
def MyFunctionInModule():
global gvar2
gvar2 = "global var 2"
print gvar2 + " from MyFunctionInModule"
print gvar3 + " from MyFunctionInModule"
return
и поместите его в путь поиска модуля.
2) В командной строке интерпретатора Python введите:
def MyFunction():
global gvar1
gvar1 = "global var 1"
print gvar1 + " from MyFunctionInModule"
print gvar3 + " from MyFunctionInModule"
return
global gvar3
gvar3 = "global var 3"
(а) Это работает так, как я ожидал (т.е. gvar1 и gvar3 видны везде):
MyFunction()
print gvar1 + " at prompt"
, по результатам которого:
>>> MyFunction()
global var 1 from MyFunctionInModule
global var 3 from MyFunctionInModule
>>> print gvar1 + " at prompt"
global var 1 at prompt
(б) Но это не работает:
import MyModule
MyModule.MyFunctionInModule() # gvar3 is not defined
print gvar2 + " at prompt" # gvar2 is not defined
, для которых получены следующие результаты:
>>> MyModule.MyFunctionInModule() # gvar3 is not defined
global var 2 from MyFunctionInModule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "MyModule.py", line 5, in MyFunctionInModule
print gvar3 + " from MyFunctionInModule"
NameError: global name 'gvar3' is not defined
>>> print gvar2 + " at prompt" # gvar2 is not defined
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'gvar2' is not defined
(c) Ни то, ни другое, но на меньшем уровне (т. Е. Gvar2 становится видимым):
from MyModule import *
MyFunctionInModule() # gvar3 is not defined
print gvar2 + " at prompt"
, для которых получены следующие результаты:
>>> MyFunctionInModule() # gvar3 is not defined
global var 2 from MyFunctionInModule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "MyModule.py", line 5, in MyFunctionInModule
print gvar3 + " from MyFunctionInModule"
NameError: global name 'gvar3' is not defined
>>> print gvar2 + " at prompt"
global var 2 at prompt
Вопросы:
Может ли кто-нибудь объяснить (или дать ссылки на хорошую документацию, объясняющую), почему существуют такие различия в поведении между (a), (b) и (c)?
Что нужно сделать, чтобы получить то же поведение с (b) и (c), что и с (a)?
Некоторые связанные темы (но не полностью покрывающие мои потребности):
Область видимости глобальных переменных в модулях
Область видимости глобальной переменной Python
Спасибо за помощь.