python - 跨文件访问 Python 全局变量

标签 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 中设置/重置标志,但是处理器方法无法获得此 bool 变量的正确值。

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

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

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

最佳答案

当您在 processor.py 中使用 from lib import * 时,您会得到 snapshot lib 中发生的事情.py 那一刻。 lib.py 文件被执行,所有函数和变量都被复制并存储在 processor.py 的命名空间中。您没有存储对来自 lib.py 的原始 vflag 的引用 - 您正在存储一个全新的副本。因此,如果您在 lib.py 中更改了 vflag,那么 processor.py 将永远不会知道它。

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

关于python - 跨文件访问 Python 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25072311/

相关文章:

python - 如何将 python 列表与共享项合并到新列表中

php - 使用 PHP/MySQL 导入 CSV 数据

iphone - 我的 UIColor 代码有什么问题?

python - 如何使用 tkinter 返回 Base 64 编码图形的高度和宽度

python - 以 csv 正确格式编写字典项目

python - 为什么 sage 将本地 python 变量视为全局变量?

csv - SQLITE:从CSV导入数据

python - Python 导入究竟是如何工作的?

c++ - 从 C++ 中的函数返回全局对象

javascript - 带参数的函数中的全局变量