Python中的导入模块

2019年12月08日 阅读数:56
这篇文章主要向大家介绍Python中的导入模块,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1,导入模块的的几种方式

模块是什么?
模块实际上就是 以.py为结尾的文件
注意点:自定义的模块尽可能不要和系统模块重名python

模块内部封装了不少实用的功能,有时在模块外部调用就须要将其导入,导入模块简单划分,实际上就只有两种:linux

  • import ……
  • from …… import

详细一点划分有五种:web

  • 1,improt 模块名
    调用:模块名.功能名
  • 2,import 模块名 as 别名
    调用:别名.功能名
  • 3,from 模块名 import 功能名
    调用:直接功能名
  • 4,from 模块名 import 功能名 as 别名
    调用: 直接拿别名来用
  • 5,from 模块名 import * (用 * 号 一次性导入全部功能)
    调用:直接功能名
    注意点:* 号无法用别名

2,模块的搜索路径

sys.path 返回导入模块时的搜索路径集,是一个list列表。app

这里写图片描述

  • 从上面列出的目录里依次查找要导入的模块文件
  • ’ ’ 表示当前路径
  • 列表中的路径的前后顺序表明了python解释器在搜索模块时的前后顺序

能够添加新的模块:svg

  • 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不能从新导入模块,从新导入需用reloadspa

建立一个reload_test.py文件,里面写一个test方法3d

这里写图片描述

打开 ipython 终端导入 reload_test 模块code

这里写图片描述

修改reload_test.py 文件中的test方法xml

这里写图片描述

再一次import reload_test 模块 而后调用test方法会发现值没变
这里写图片描述blog

缘由:import 导入模块只会导入一次,所以即便模块被修改了,import也不会从新导入
解决方案

  1. 关闭终端,从新打开,而后再import 导入一次
  2. 用 reload 能够在不关闭终端的状况下从新导入

这里写图片描述

4,多模块开发时,要注意修改导入模块的值时,from……import 与 import 导入模块的区别

main.py

from send import *
from show import *

# 主流程
def main():
    # 发女友
    send()
    # 秀恩爱
    show()


if __name__ == '__main__':
    main()

send.py

#import girl
from girl import *

# 发女友
def send():
    print("发女友了,翠花是你的了")
    #girl.have_girl = True
    have_girl = True

show.py

# import girl
from girl import *

# 秀恩爱
def show():
    if have_girl == True:
    #if girl.have_girl == True:
        print("我有女友了,好开心")
    else:
        print("单身贵族")

girl.py

# 共同变量模块

have_girl = False #False表明没有女友 True表明有女友

运行结果:

发女友了,翠花是你的了
单身贵族

是否是有点惊讶?结果难道,不该该是这样的吗:

发女友了,翠花是你的了
我有女友了,好开心

会产生这种状况的缘由:
import girl 能够理解为地址的复制,也就是 引用 用来修改值
from girl import * 能够理解成内容的复制,也就是深拷贝,那么深拷贝有什么特色,深拷贝最大的特色就是数据独立。
这里写图片描述