Pulpcode

捕获,搅碎,拼接,吞咽

0%

从几个实验来分析python import

一些实验:

首先a文件中有:

1
print "this is a"

b文件中有:

1
2
import a
print "this is b"

然后执行b: python b.py

结果为:

this is a
this is b

结论:在import a的时候,执行了a脚本


然后我们又多加了一个文件c:

1
2
import b
print "this is c"

打印结果:

this is a
this is b
this is c

结论:
a模块被执行了,通过b


然后我们将c模块改为:

1
2
3
import a
import b
print "this is c"

打印结果:

this is a
this is b
this is c

结论:没有重复导入,模块只被导入一次。


我们a文件加入函数:

1
2
3
import a
def afun():
print "this is afun"

b文件不变,运行结果:

this is a
this is b

结论:部分导入,也会执行a。


我们在a中加入全局变量:g

1
g = 5

然后在b中修改此值

1
2
import a
a.g = 6

然后在c文件通过方式1引用此值:

1
2
from a import g
print g

打印结果:5

之后在通过方式2引用此值:

1
2
import a
print a.g

打印结果:6

结论:from xxx import xxximport 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 *