摘要:
取决于函数的定义方式(在本地或模块中)以及如何导入模块,全局变量的范围有所不同。 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"
(a)这与我预期的一样(即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
(b)但这不起作用:
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)相同的行为应该怎么做?
一些相关主题(但不能完全满足我的需求):
Global variables scope in modules
Python global variable scoping
感谢您的帮助。
答案 0 :(得分:0)
execfile()确实可以完成这项工作,但我不确定是否可以将其视为良好做法:
execfile("MyModule.py")
global gvar3
gvar3 = "global var 3"
MyFunctionInModule()
print gvar2 + " at prompt"
其结果为:
>>> MyFunctionInModule()
global var 2 from MyFunctionInModule
global var 3 from MyFunctionInModule
>>> print gvar2 + " at prompt"
global var 2 at prompt