python导入行为:来自同一文件的不同对象?

时间:2013-08-09 16:59:08

标签: python object import module

考虑一下:

/
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。有人可以解释一下这种行为,因为它非常令人困惑,而且我没有找到任何关于它的文档。

谢谢!

2 个答案:

答案 0 :(得分:2)

模块使用它们的虚线名称作为键缓存在dicitonary sys.modules中。由于您使用两个不同的虚线名称导入相同的模块,因此您最终会获得此模块的两个副本,并且还会包含其中所有内容的两个副本。

解决方案很简单:不要这样做,并尽量避免弄乱sys.path

答案 1 :(得分:0)

x.plib.x.p不是同一个模块。它们来自同一个文件,但Python没有通过其文件确定模块的标识;模块的标识基于其包限定名称。模块搜索逻辑可能已为两个模块找到相同的文件,但它们仍然是单独加载和执行的,并且在一个模块中创建的对象与在另一个模块中创建的对象不同。