摘要:
根据函数的定义方式,无论是在本地还是在模块中,以及模块的导入方式,全局变量的范围各不相同。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)相同的行为?
一些相关主题(但没有完全涵盖我的需求):
模块中的全局变量范围
Python全局变量范围
谢谢你的帮助。
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