一:import搜索模块路径
1):使用sys.path查看当前程序的模块搜索路径,返回一个列表
2):使用sys.path.append(‘模块路径’)添加自定义模块
例如:添加桌面上的demo.py模块
3):通过修改环境变量添加自定义模块
4):通过创建.pth文件添加自定义模块(推荐此方法添加自定义模块路径)
二:import和from A import B 执行过程浅析
1:import A
1):判断A模块是否已经被导入到sys.modules中了,(sys.modules中保存的是已经被导入过的模块),如果已经被导入了就不再导入,而是直接使用模块对象
2):如果没有找到,python解释器就去sys.path中去搜索,如果没有找到,则抛出异常。
3):根据模块文件A.py创建一个模块对象(和模块名一样)
4):把模块对象的名字添加到本地作用域中(使用locals查看本地作用域的所有名字)
Reload:重新加载模块,对模块对象添加新属性(将新的属性添加到原有对象)
2:from A import B
1): 判断A模块是否已经被导入过了
2): 如果没有找到 python就是去 sys.path 搜索 <创建空对象《和模块名是同名的》>,如果没有到 抛出异常
3): 根据模块文件A.py 导入到python解释器中 根据模块文件往对象中新增对应的属性
4): 把模块对象的属性名 添加到本地作用域
查看本地作用域的所有名字<本地名字空间> locals()
3:修改模块中的一个属性
1):如果属性是不可变类型的
From A import B方式:在当前作用域只是保存的是模块对象A中属性B的引用,只会在当前作用域修改B的值,不会修改模块对象中的B属性的值
Import A方式:当前作用域保存的是模块对象的引用,所以能够修改 模块属性的值
2):如果属性是可变类型的
from A import B方式:在当前作用域只是保存的是模块对象中属性B的引用 ,也就是说 B和A.B引用同样的数据,此时 如果在当前作用域修改B的值是能够修改属性的值。
Import A方式:当前作用保存的是模块对象的引用,修改的就是模块对象当中的属性的值,所以能够修改 模块属性的值
例如:导入cat.py模块并修改模块对象的属性值