'from modulename import function/variable' 是否将整个模块放入系统模块字典中?
Does 'from modulename import function/variable' put entire module in the sys modules dictionary?
当我们执行 import modulename
时,函数和变量将在模块名称空间(全局)中设置。例如,对变量所做的任何更改都是全局可见的。
当我们执行 from modulename import function
或 variable
时,该函数或变量将加载到调用模块命名空间(本地)中。对变量的任何更改都不是全局的,而是仅在调用模块内。
但是,是否使用 from modulename import function
或 variable
- 将整个模块放入 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
当我们执行 import modulename
时,函数和变量将在模块名称空间(全局)中设置。例如,对变量所做的任何更改都是全局可见的。
当我们执行 from modulename import function
或 variable
时,该函数或变量将加载到调用模块命名空间(本地)中。对变量的任何更改都不是全局的,而是仅在调用模块内。
但是,是否使用 from modulename import function
或 variable
- 将整个模块放入 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