当我们在 Python 脚本中导入模块时,这是将所有必需的代码复制到脚本中,还是只是让脚本知道在哪里可以找到它?
如果我们在代码中不使用模块会发生什么,它是否会以某种方式被优化出来,就像在 C/C++ 中一样?
这些都不是这样。
导入执行两件事。首先,如果以前未加载请求的模块,则导入将加载模块。这主要归结为创建一个新的全局作用域,并在该作用域中执行模块的代码以初始化模块。新的全局作用域用作模块的属性,以及模块中任何代码的全局变量查找。
其次,导入绑定了所要求的任何名称。 import whatever
将whatever
名称绑定到whatever
模块对象。 import whatever.thing
还将whatever
名称绑定到whatever
模块对象。 from whatever import somefunc
在whatever
模块对象上查找 somefunc
属性,并将somefunc
名称绑定到属性查找找到的任何内容。
无法优化未使用的导入,因为模块加载和名称绑定都具有某些其他代码可能依赖的效果。