Python导入全局字典为何生成新实例?ID不同且数据未同步
问题原因分析
你的问题本质是Python模块导入时的命名空间隔离和循环导入触发的模块重复加载导致的,具体过程拆解如下:
初始运行阶段
当你直接运行main.py时,Python会把这个脚本作为__main__模块加载,执行顶层代码d = {},此时创建的字典是__main__.d(对应你输出里最后一行的ID:2175238904384)。循环导入触发新模块加载
进入if __name__ == '__main__':代码块后,你导入了add_cache模块,随后调用AddDictTest.add_to_dict()。在这个方法里,from main import d会触发Python加载main模块(注意这里的main是普通模块名,不是__main__),Python会重新执行main.py的顶层代码,再次创建一个新的空字典main.d(对应前两行输出的ID:2175240751296)。修改的是另一个实例
你在add_to_dict里修改的是main.d,但main.py最后打印的是__main__.d——这是两个完全独立的字典实例,所以原字典始终为空,且ID不同。
解决方案
最直接的修复方式是把全局字典抽离到一个独立的模块中,避免循环导入:
- 创建
cache.py:
d = {}
- 修改
main.py:
from cache import d if __name__ == '__main__': from add_cache import AddDictTest AddDictTest.add_to_dict("a") AddDictTest.add_to_dict("b") print("d id is ", id(d)) print(d)
- 修改
add_cache.py:
class AddDictTest(object): @classmethod def add_to_dict(cls, key): from cache import d tt = d.setdefault(key, {}) tt["b"] = "b" print("d id is ", id(d))
这样所有模块都共享同一个cache.d实例,修改和读取的都是同一个字典,不会出现ID不一致和内容为空的问题。
内容的提问来源于stack exchange,提问作者Bubble
相关产品推荐
相关产品推荐

