python从另一个文件中导入一个字典,但它似乎创建一个新的字典

问题描述 投票:0回答:1

问题是当我导入一个字典时,我认为它是一个全局变量,但是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 python-3.x python-2.7 import python-import
1个回答
0
投票

这是因为当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
© www.soinside.com 2019 - 2024. All rights reserved.