跨文件访问Python全局变量

时间:2014-08-01 03:11:32

标签: python import global

我在项目中有三个python文件:

'''lib.py
   library file that first defines and also accesses a boolean flag'''
vflag = False
...
def lib_method()
  global vflag
  if not vflag:
    do_something_here

'''app.py
   main application that sets the boolean flag defined in lib.py'''
import lib
lib.vflag = method_that_sets_or_resets_vflag()


'''processor.py
   does some processing and needs to access the bool flag'''
from lib import *
...
def processor_method()
  global vflag
  ...
  if vflag:
    do_something_here

我可以在app.py设置/重置标志,但处理器方法无法获得此布尔变量的正确值。

它只获取lib.py开头设置的内容(不是app.py设置的内容)。要求是通过app.py访问运行时设置的值,而不是lib.py初始化它的值

我在app.py和processor.py以不同的方式导入lib文件。这有什么不同吗?

这可能是一个根本性的错误,所以如果有人能指出我具体的知识库,我将不胜感激。 而且,它弄乱了我对全局变量的理解。如果我将变量定义为'global',这是否意味着变量在导入此变量的所有文件(或包含变量定义的文件)中保持为全局变量

2 个答案:

答案 0 :(得分:5)

当您在from lib import *中使用processor.py时,您将获得快照,了解当前lib.py中正在进行的操作。执行lib.py文件,并复制所有函数和变量并将其存储在processor.py的命名空间中。您没有存储来自vflag的原始lib.py的引用 - 您正在存储一个全新的副本。因此,如果您更改vflag中的lib.py,那么processor.py将永远不会知道它。

更好的做法是始终使用import lib,只需使用lib.vflag访问变量即可。您甚至不需要使用global关键字。

答案 1 :(得分:2)

这种情况的最佳做法是将vflag传递给您需要的函数作为参数,并且不使用全局变量。