模块中全局变量的范围

2024-05-03 23:53:55 发布

您现在位置:Python中文网/ 问答频道 /正文

摘要:

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

谢谢你的帮助


Tags: infromisvarnotglobalpromptat
1条回答
网友
1楼 · 发布于 2024-05-03 23:53:55

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

相关问题 更多 >