以下内容摘自<<Python学习手册>>(第四版)
1. import和 from是赋值语句
- import module1
将module1整个模块对象复制给变量名module1 - from module1 import a
将module1中的变量名a赋值给当前模块中的同名对象a
需要注意的是,Python中的赋值语句,对于可变对象,是引用;对不可变对象,是赋值。
在module1中, a被定义为列表[1,2]
from module1 import a
a[0] = 2 # 此时module.a变为 [2,2]
a = 2 # module.a还是[2,2]
2. from语句的实质
from module import a,b
与以下语句等效:
import module
a = module.a
b = module.b
注意:from的第一步也是普通的import语句,因此from总会把整个模块对象赋值给一个变量。
只加载模块的某一部分(如一个类,一个函数)是不可能的,因为from和import语句其实都是加载了整个模块,只是from多一个从导入模块赋值部分变量名到当前空间的操作。
因此,无论是使用import还是from, 此模块的顶层可执行代码都会被执行。
(使用if __name == 'main’避免被执行)
3. 导入只发生一次
对每个进程,相同的模块只会被导入一次。因此,模块文件的顶层代码只会被执行一次,可以凭借这种特性进行变量初始化。
(使用内置函数reload,将一个模块的代码导入后再次运行)
4. from语句的潜在陷阱
如果使用from语句,那些被复制的变量碰巧和当前空间已有的变量(可能是之前的from语句复制进来的)同名,之前的就会被覆盖。
建议:
- 简单模块使用import (避免重名)
- 复杂模块使用from,用于明确列出想要使用的变量(简洁)