模块中全局变量的范围

时间:2019-01-04 11:06:39

标签: python python-2.7 import module global-variables

摘要:

取决于函数的定义方式(在本地或模块中​​)以及如何导入模块,全局变量的范围有所不同。 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

感谢您的帮助。

1 个答案:

答案 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