跨文件访问Python全局变量

3 投票
2 回答
1222 浏览
提问于 2025-04-18 15:36

我在一个项目里有三个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里设置或重置一个标志,但processor方法却无法获取这个布尔变量的正确值。

它只获取lib.py开头设置的值,而不是app.py设置的值。我的需求是要获取app.py在运行时设置的值,而不是lib.py初始化时的值。

我在app.py和processor.py中以不同的方式导入lib文件,这会有影响吗?

这可能是个基本错误,所以如果有人能给我指个明路,我会很感激。同时,这也让我对全局变量的理解有些困惑。如果我把一个变量定义为'global',那是不是意味着这个变量在所有导入了这个变量(或者包含变量定义的文件)的文件中都保持为全局变量?

2 个回答

2

在这种情况下,最好的做法是把 vflag 作为参数传递给你需要的函数,而不是使用全局变量。

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 这个关键词。

撰写回答