我有两个文件
runner.py
- main
import secondthread
my_dict = {}
def action1():
my_dict["i"] = 2
if __name__ == "__main__":
action1()
secondthread.action2()
secondthread.py
import runner
def action2():
try:
print("Thread2: dict value is = {}".format(runner.my_dict["i"]))
except Exception as e:
print("Thread2: dict haven't got updated value, len of dict is: {}".format(len(runner.my_dict)))
我不确定为什么尽管顺序运行action1
然后action2
不更新字典与新的键值对。
我已经尝试将my_dict
设置为secondthread.py
中的全局变量,它不起作用。我明白,也许循环依赖(runner.py
依赖于secondthread.py
和secondthread.py
依赖于runner.py
可能有问题,但我不确定如何从secondthread.py
中读取my_dict
)。
Update1:我也试过在secondthread.py
内,仍然导致相同的错误。
from runner import my_dict
这个方法不是已经从全局命名空间检索my_dict
了吗?
我认为问题的关键在于由于循环导入,runner
第二次被导入。导入模块将导致其代码运行,因此my_dict
将再次初始化,这是您不想要的。依赖于模块导入顺序或频率的代码是有问题的。
解决此类问题的推荐方法是将变量初始化移到单个模块中,然后从每个文件导入一次:https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables-across-modules在您的示例中,您将创建第三个文件,例如init_vars.py
,并从runner.py
和secondthread.py
中导入它。