1

考虑一下:

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

谢谢!

4

2 回答 2

2

模块sys.modules使用它们的虚线名称作为键缓存在字典中。由于您通过两个不同的点名称导入同一个模块,因此您最终会得到该模块的两个副本,并且其中的所有内容也有两个副本。

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

于 2013-08-09T17:07:24.660 回答
0

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

于 2013-08-09T17:04:40.733 回答