模块中全局变量的范围



摘要:

根据函数的定义方式,无论是在本地还是在模块中,以及模块的导入方式,全局变量的范围各不相同。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

相关内容

  • 没有找到相关文章

最新更新