'from modulename import function/variable' 是否将整个模块放入系统模块字典中?

Does 'from modulename import function/variable' put entire module in the sys modules dictionary?

当我们执行 import modulename 时,函数和变量将在模块名称空间(全局)中设置。例如,对变量所做的任何更改都是全局可见的。

当我们执行 from modulename import functionvariable 时,该函数或变量将加载到调用模块命名空间(本地)中。对变量的任何更改都不是全局的,而是仅在调用模块内。

但是,是否使用 from modulename import functionvariable - 将整个模块放入 sys 模块中?或者只有导入的 function/variable?

即使您只从模块中导入一组选定的名称,模块仍然需要完全编译和执行才能导入指定的名称,所以是的,使用 from module_name import variable_name 确实将整个模块进入模块缓存。

由于导入的模块缓存在 Python 的 sys.modules 字典中,您可以通过输出导入前后 sys.modules 的键之间的差异来验证行为:

import sys
modules = sys.modules.copy()
from math import sqrt # selectively import just sqrt from the math module
print(list(sys.modules.keys() - modules.keys()))

这输出:

['math']

然后您可以访问 math 模块中的其他变量,即使您只从 math 导入了 sqrt:

print(sys.modules['math'].pi)

这输出:

3.141592653589793