【问题标题】:scope of global variables in modules模块中全局变量的范围
【发布时间】: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


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2012-04-29
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多