问题是当我导入一个字典时,我认为它是一个全局变量,但是python似乎创建了一个新的字典,它们有不同的id。我听不懂
有两个文件,名为 main.py 和 add_cache.py
# main.py
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 main import d
tt = d.setdefault(key, {})
tt["b"] = "b"
print("d id is ", id(d))
当我运行 main.py 时
#output is
d id is 2175240751296
d id is 2175240751296
d id is 2175238904384
{}
以我的理解,d不为空,并且那里的id应该相同。
我想知道为什么在导入时创建一个新的空字典,我问过gpt,它给出了关于循环导入的答案。但我还是不明白深层的原因。
这是因为当Python解释器启动时,主程序被导入并缓存为名称为
__main__
的模块,在d
模块的命名空间中为__main__
创建了一个dict实例。
因此,当您导入名为
main
的主程序时:
from main import d
导入系统在模块缓存中找不到名称
main
,因此它再次执行主程序的代码,在d
模块的命名空间中为main
创建一个新的字典实例。
只需在主程序中添加
__name__
的输出即可验证此行为:
# main.py
print('creating d in', __name__)
d = {}
...
您的程序将输出类似以下内容:
creating d in __main__
creating d in main
d id is 124515429184320
d id is 124515429184320
d id is 124515428819648
{}
一个简单的修复方法是显式导入
__main__
模块,方法是更改:
from main import d
至:
from __main__ import d
但这将阻止您的其他模块成为程序的入口点。更好的方法是在单独的模块中创建所有全局变量,例如
settings.py
,这样包括主模块在内的所有模块都可以这样做:
from settings import d