【发布时间】:2019-01-04 11:06:39
【问题描述】:
总结:
取决于函数的定义方式——本地或模块中,以及模块的导入方式——全局变量的范围不同。 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
感谢您的帮助。
【问题讨论】:
标签: python python-2.7 import module global-variables