跨文件访问Python全局变量

3

我在一个项目中有三个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个回答

5
当你在 processor.py 中使用 from lib import * 时,你获得的是此时在 lib.py 中发生的一切的快照。 lib.py 文件被执行,所有函数和变量都被复制并存储在 processor.py 的命名空间中。你并没有存储对来自lib.py原始 vflag 的引用 - 你正在存储一个全新的副本。因此,如果你在 lib.py 中更改了 vflag,那么 processor.py 将永远不会知道它。
更好的做法是始终使用 import lib,然后只使用 lib.vflag 访问变量。你甚至不需要使用 global 关键字。

2

在这种情况下的最佳实践是将vflag作为参数传递给您需要使用的函数,而不要使用全局变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接