Python跨模块导入全局字典为空的原因是什么?
底层原理说明
这个现象和变量是否为字典没有关系,核心是Python的导入机制和变量绑定逻辑:
- 当你执行
from dc_globals import _args_dict时,Python会在当前模块的命名空间创建一个新的变量_args_dict,这个变量会和导入瞬间dc_globals模块里的_args_dict指向同一个对象。你代码中初始化dc_globals时_args_dict指向空字典,所以当前模块的_args_dict此时也指向这个空字典。 - 你调用的
set_args方法里用了global _args_dict后直接给_args_dict赋值:_args_dict = args,这个操作会修改dc_globals模块命名空间里的_args_dict变量的指向,让它指向你传入的新字典对象。但当前模块里之前导入的_args_dict还是指向最开始的那个空字典,二者已经指向不同对象了,所以打印出来是空的。 - 你通过
dc_globals._args_dict访问时,是直接读取dc_globals模块命名空间里的_args_dict变量,这个变量已经被更新为指向新字典,所以能拿到正确值。 - 你看到直接导入的
_G和模块访问的_G值一致,只是因为你全程没有修改过_G的指向,二者一直指向同一个字符串对象。如果写一个修改_G的方法重新给它赋值,你会发现直接导入的_G也会和模块访问的_G结果不一致。
适配存量改造的优化方案
如果你希望继续用from dc_globals import _args_dict的导入方式减少存量代码改动,可以修改set_args的实现,不要重新给_args_dict赋值,而是修改原字典的内容:
def set_args(args): global _args_dict # 清空原字典内容后更新,不改变变量指向 _args_dict.clear() _args_dict.update(args)
这种情况下所有导入的_args_dict都指向同一个字典对象,修改内容会对所有导入方生效,不需要改现有导入和使用逻辑。
内容的提问来源于stack exchange,提问作者eorojas
相关产品推荐
相关产品推荐

