我在项目中有三个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',这是否意味着变量在导入此变量的所有文件(或包含变量定义的文件)中保持为全局变量
答案 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
传递给您需要的函数作为参数,并且不使用全局变量。