Python 是否';从modulename导入函数/变量';是否将整个模块放入sys modules字典?
当我们导入modulename时,函数和变量在modulename命名空间(全局)中得到设置。例如,对变量所做的任何更改都是全局可见的 当我们从modulename导入函数或Python 是否';从modulename导入函数/变量';是否将整个模块放入sys modules字典?,python,python-3.x,python-import,Python,Python 3.x,Python Import,当我们导入modulename时,函数和变量在modulename命名空间(全局)中得到设置。例如,对变量所做的任何更改都是全局可见的 当我们从modulename导入函数或变量执行操作时,该函数或变量将加载到调用模块名称空间(本地)中。对变量的任何更改都不是全局的,而是仅在调用模块中进行的 但是,使用modulename中的导入函数或变量,是否将整个模块放入sys模块中?或者只导入函数/变量?即使只从模块中导入一组有选择的名称,该模块仍然需要对要导入的指定名称进行完全编译和执行,因此,使用fr
变量
执行操作时,该函数或变量将加载到调用模块名称空间(本地)中。对变量的任何更改都不是全局的,而是仅在调用模块中进行的
但是,使用modulename中的导入函数
或变量
,是否将整个模块放入sys模块中?或者只导入函数/变量?即使只从模块中导入一组有选择的名称,该模块仍然需要对要导入的指定名称进行完全编译和执行,因此,使用from module_name import variable_name
确实会将整个模块放入模块缓存中
由于导入的模块缓存在Python中的sys.modules
dict中,因此可以通过输出导入前后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']
3.141592653589793
然后,您可以访问math
模块中的其他变量,即使您仅从math
导入sqrt
:
print(sys.modules['math'].pi)
这将产生:
['math']
3.141592653589793
不可避免地,整个事情。基本上是因为暂停问题,所以整个导入的模块运行,只有函数/变量进入调用者名称空间(本地),而其余的都在被调用者名称空间(全局)?当您说整个模块被放入sys.modules时,sys.modules到底持有什么?是模块名还是模块中的每个函数和变量?整个模块表示模块对象本身。我已经更新了我的答案以反映这一点。谢谢。只是古玩-像这样使用-sys.modules['math'].pi是一个好的实践吗?不是一个好的实践。您应该简单地使用from math import pi
语句来实现这一点。在您的示例中,sqrt是局部的,pi是全局的,对吗?所以,如果它是一个变量而不是一个函数,那么对pi的更改将是局部的,而对sqrt的更改将是全局可见的?