一些实验:
首先a文件中有:
1 | print "this is a" |
b文件中有:
1 | import a |
然后执行b: python b.py
结果为:
this is a
this is b
结论:在import a的时候,执行了a脚本
然后我们又多加了一个文件c:
1 | import b |
打印结果:
this is a
this is b
this is c
结论:
a模块被执行了,通过b
然后我们将c模块改为:
1 | import a |
打印结果:
this is a
this is b
this is c
结论:没有重复导入,模块只被导入一次。
我们a文件加入函数:
1 | import a |
b文件不变,运行结果:
this is a
this is b
结论:部分导入,也会执行a。
我们在a中加入全局变量:g
1 | g = 5 |
然后在b中修改此值
1 | import a |
然后在c文件通过方式1引用此值:
1 | from a import g |
打印结果:5
之后在通过方式2引用此值:
1 | import a |
打印结果:6
结论:from xxx import xxx
与 import xxx
的方式不同,第二种,变量被共享了。
我们试着在a中写:import b
在b中写import a
,然后执行,报错,报异常,ImportError
结论,不能够嵌套import,你中有我,我中有你?
原理:
import 机制是如何工作的?
python在一开始的时候预先加载一批内建模块到内存,这些模块被加载到sys.modules
ules,
当一个模块被加载时,首先看是否存在,如果存在,就将其导入当前局部命名空间。
如果不存在,就将其放入sys.modules.
如果模块未编译,则先要对模块进行编译。
执行动态加载,在当前模块的命名空间执行编译后的字节码,并将其中所有的对象放入模块对应的字典中。
也就是说import xx,xx是在引用sys.modules中的模块,而 from xx import xx则是导入当前局部变量了。
原则
如果你实在是懒得弄清楚原理,那么只需要记住这些原则就可以了。
优先使用: import a
有截至的使用: from a import b
尽量避免使用: from a import *