考虑一下:
/
test.py
lib/
L __init__.py
+ x/
L __init__.py
L p.py
使用p.py:
class P():
pass
p1 = P()
使用test.py:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib"))
import lib.x.p
import x.p
print(id(lib.x.p.p1))
print(id(x.p.p1))
虽然我从同一个软件包/模块导入相同的对象,但我得到了不同的对象ID。有人可以解释一下这种行为,因为它非常令人困惑,而且我没有找到任何关于它的文档。
谢谢!
答案 0 :(得分:2)
模块使用它们的虚线名称作为键缓存在dicitonary sys.modules
中。由于您使用两个不同的虚线名称导入相同的模块,因此您最终会获得此模块的两个副本,并且还会包含其中所有内容的两个副本。
解决方案很简单:不要这样做,并尽量避免弄乱sys.path
。
答案 1 :(得分:0)
x.p
和lib.x.p
不是同一个模块。它们来自同一个文件,但Python没有通过其文件确定模块的标识;模块的标识基于其包限定名称。模块搜索逻辑可能已为两个模块找到相同的文件,但它们仍然是单独加载和执行的,并且在一个模块中创建的对象与在另一个模块中创建的对象不同。