繁体   English   中英

模块中全局变量的范围

[英]scope of global variables in modules

摘要:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM