模块:
一系列功能的结合体
常见的四种模块:
1.使用python编写的.py文件
2.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
3.使用c编写并链接到python解释器的内置模块
4.已被编译为共享库或DLL的C或C++扩展
模块的搜索路径:
搜索顺序:内存>>>内置模块>>>sys.path
1.导入模块会优先在内存中查找
2.内存中没有被加载的话,再去查找内置模块
3.还没有查找到,就根据sys.path中的路径顺序逐一查找
模块导入的执行流程:
导入模块的指令:
相对于函数名()调用函数体,函数调用会进入涵涵素体,从上至下逐句解释执行函数体代码
导入模块,会进入模块文件,从上至下逐句解释执行模块文件代码
如果在模块中又遇到导入其他模块,会接着进入导入的模块,从上至下逐句解释执行模块文件代码
循环导入:
模块之间出现了环状导入.如m1.py中导入了m2,m2.py中又导入了m1
循环导入的问题:
导入模块是要使用模块中的变量
正常逻辑都是在文件最上方先完成对模块的导入,再在下方定义自身模块变量,以及导入的模块中变量
由于导入模块的特殊机制,第一次导入模块会编译执行导入的模块就是会进入模块逐句执行模块内容,再次导入只是使用内存中的名字
就会出现下面的情况,m2在使用m1中的变量x,但变量x却并未产生,这就出现了循环导入问题
m1.py文件
import m2
x = 10
print(m2.y)
m2.py文件
import m1
y = 10
print(m2.x)
解决循环导入的问题:延后导入
1、将循环导入对应包要使用的变量提前定义,再导入响应的包
2、将导包的路径放倒函数体中,保证存放导包逻辑的函数调用在要使用的变量定义之后
重点:
问题:from导包极容易出现循环导入问题
解决:取消from导入方式,采用import导入方式