这个问题只是为了我对Python模块的理解。
我很好奇除了可读性之外,这两行之间是否有任何有意义的差异:
import module ; import module as blah
和
import module ; blah = module
?
它们是相同的并产生相同的模块对象:
import pathlib as p1
import pathlib
p2 = pathlib
assert p1 is p2
assert p1 == p2
for attr in dir(p1):
assert getattr(p1, attr) == getattr(p2, attr)
for attr in dir(p2):
assert getattr(p1, attr) == getattr(p2, attr)
以上适用于 CPython 3.11 和 PyPy 3.10 (v7.3.12)。
特别是在 CPython 中,带有
as
的版本使用更少的字节码操作:
Python 3.11.6 (main, Oct 2 2023, 17:46:45) [Clang 13.1.6 (clang-1316.0.21.2.5)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.14.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def g():
...: import pathlib as p2
...: return p2
...:
In [2]: def f():
...: import pathlib
...: p1 = pathlib
...: return p1
...:
In [3]: dis(g)
1 0 RESUME 0
2 2 LOAD_CONST 1 (0)
4 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (pathlib)
8 STORE_FAST 0 (p2)
3 10 LOAD_FAST 0 (p2)
12 RETURN_VALUE
In [4]: dis(f)
1 0 RESUME 0
2 2 LOAD_CONST 1 (0)
4 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (pathlib)
8 STORE_FAST 0 (pathlib)
3 10 LOAD_FAST 0 (pathlib)
12 STORE_FAST 1 (p1)
4 14 LOAD_FAST 1 (p1)
16 RETURN_VALUE
但是这种差异在任何实际使用中都不应该明显。
请注意,您不需要在
import module
之前写 import module as foo
。在 import
的每种形式中,模块都会被完整加载并以其原始名称存储在内存中。