1,导入模块的的几种方式
模块是什么?
模块实际上就是 以.py为结尾的文件
注意点:自定义的模块尽量不要和系统模块重名
模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入,导入模块简单划分,实际上就只有两种:
import ……
from …… import
详细一点划分有五种:
1,improt 模块名
调用:模块名.功能名2,import 模块名 as 别名
调用:别名.功能名3,from 模块名 import 功能名
调用:直接功能名4,from 模块名 import 功能名 as 别名
调用: 直接拿别名来用5,from 模块名 import * (用 * 号 一次性导入所有功能)
调用:直接功能名
注意点:* 号没法用别名
2,模块的搜索路径
sys.path 返回导入模块时的搜索路径集,是一个list列表。
从上面列出的目录里依次查找要导入的模块文件
’ ’ 表示当前路径
列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序
可以添加新的模块:
sys.path.append(‘/home/python/xxx’)
sys.path.insert(0, ‘/home/python/xxx’) # 可以确保先搜索这个路径
注意点:sys.path.append(path)和sys.path.insert(path)添加的相关路径,在退出交互式环境或者IDE后会自动消失。
In [37]: sys.path.insert(0,"/home/python/xxxx") In [38]: sys.path Out[38]: ['/home/python/xxxx', '', '/usr/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3/dist-packages/IPython/extensions', '/home/python/.ipython']
3,重新导入模块
模块被导入后,import module不能重新导入模块,重新导入需用reload
创建一个reload_test.py文件,里面写一个test方法
打开 ipython 终端导入 reload_test 模块
修改reload_test.py 文件中的test方法
再一次import reload_test 模块 然后调用test方法会发现值没变
原因:import 导入模块只会导入一次,因此即使模块被修改了,import也不会重新导入
解决方案
关闭终端,重新打开,然后再import 导入一次
用 reload 可以在不关闭终端的情况下重新导入
4,from……import 与 import 导入模块的区别
main.py
from send import *from show import *# 主流程def main(): # 发女朋友 send() # 秀恩爱 show()if __name__ == '__main__': main()
send.py
#import girlfrom girl import *# 发女朋友def send(): print("发女朋友了,翠花是你的了") #girl.have_girl = True have_girl = True
show.py
# import girlfrom girl import *# 秀恩爱def show(): if have_girl == True: #if girl.have_girl == True: print("我有女朋友了,好开心") else: print("单身贵族")
girl.py
# 共同变量模块have_girl = False #False代表没有女朋友 True代表有女朋友123
运行结果:
发女朋友了,翠花是你的了 单身贵族
是不是有点惊讶?结果难道,不应该是这样的吗:
发女朋友了,翠花是你的了 我有女朋友了,好开心
会产生这种情况的原因:
import girl 可以理解为地址的复制,也就是 引用 用来修改值
from girl import * 可以理解成内容的复制,也就是深拷贝,那么深拷贝有什么特点,深拷贝最大的特点就是数据独立。