a.py
from b import fun_bdef fun_a(): pass
b.py
from a import fun_adef fun_b(): pass
执行a.py会发生什么呢?fun_b无法被导入。
不管是import module 还是from module import xx,这些都是可执行语句,被执行时:
如果sys.modules中不存在该模块,就会创建该模块的实例并且去执行该模块的代码,在所有代码执行完后才把控制权交给调用方。
如果sys.modules存在该模块,就会直接返回该模块对象,无论该被导入模块的所有代码是否被执行。这就是为什么互相导入可能无法找到被import模块中对象的原因。
Follow上面的rule,我们看看遍执行a.py时程序做了什么?
代码执行from b import fun_b,发现sys.modules里没有b模块的记录,所以创建b模块实例开始执行b模块的代码。
在b模块里代码执行from a import fun_a,发现sys.modules里没有a模块的记录,所以创建a模块实例执行a模块的代码,所以这里程序并没有执行b后面的代码去定义fun_b而是把控制权交给了a模块。
a模块又来到了from b import fun_b,但是sys.modules已经有了b模块对象,所以不会再次执行b模块的代码,但是因为b模块的fun_b函数对象没有执行到,所以就找不到该对象而报出异常
![a4d58263b886f6eaee74c00f775e86c0.png](https://i-blog.csdnimg.cn/blog_migrate/65b9e2844c4238fdcf0a73027ea6cdf3.png)
![31f52772f69fa81fea08870aaa5f09f3.png](https://i-blog.csdnimg.cn/blog_migrate/8cb27e23e16ff6efae6501ac8af2f180.jpeg)
听说关注我们的人 都升职加薪啦
你要做的
无非是
长按关注
![caa9d679cd50dbe22ee1061b62615a0b.gif](https://i-blog.csdnimg.cn/blog_migrate/f92836b3acab8b1ddd79086b951c5f7c.gif)