Python3中的模块和包 -前沿人工智能网

1:模块介绍

在Python中,每一个文件都是一个模块,模块是最高级别的程序组织单元,它将程序代码和数据封装起来以便再次利用,同时提供自包含的命名空间以便避免程序出现变量名冲突。模块在导入其他模块之后就可以使用被导入模块中定义的名称。

2:模块的导入方式及过程

2.1:import,from xx import yy

import:把一个模块整体导入:

import randomprint(random.randint(1,20)) # 也可以取别名# import random as aaa# print(aaa.randint(1,20))

2.2:imp.reload 动态导入

在不终止Python程序的情况下,重新载入模块文件代码的方法。

2.3:模块导入过程

import和from都是隐式的赋值语句:

import将整个模块对象赋值给一个单独的名称。

from将一个或多个名称赋值给另一个模块中的同名对象。

每个进程中的单个模块(文件)只做一次导入:模块在第一次import或from时被载入并执行,在第二次及以后的导入时不会加载及运行,但会进行赋值操作。模块在每次导入时会先去sys.modules中查找被导入的模块是否存在于sys.modules中,如果存在说明已经导入过,不会做加载及运行操作,如果不存在,则对导入的模块进行加载,并创建模块中的对象,运行模块中的调用的方法,完了之后把模块信息写入sys.modules中。因此模块中的变量是全局的,可以在不同的模块中进行共享,不会在每次导入中创建一个副本。

下面来验证下:

fileA.py

lst = [1,2,3,4]print("in fileA.py")

fileB.py :导入模块fileA

import fileA fileA.lst.append("fileB")print("in fileB.py")

fileC.py :导入模块fileA

import fileA fileA.lst.append("fileC")print("in fileC.py")

test.py

print('–0001–')from xmodule import fileBprint('–0002–')from xmodule import fileCprint('–0003–')import fileAprint('–0004–')print(fileA.lst) print('–0005–')import impimp.reload(fileA)print('–0006–')print(fileA.lst)print('–0007–') /*# 输出结果:–0001– # 导入模块B,模块B中又导入模块A,模块A是本进程中第一次导入,故输出如下:in fileA.py in fileB.py–0002– # 导入模块C,模块C中又导入模块A,但模块A已被导入,故输出如下:in fileC.py–0003– # 导入模块A,但模块A已被导入,故没有输出;还是会给fileA赋值,–0004– # 打印 fileA.lst[1, 2, 3, 4, 'fileB', 'fileC']–0005– # imp.reload(fileA) 重新加载模块fileA,lst被重新赋值in fileA.py–0006– # 重新加载之后,lst被重新赋值[1, 2, 3, 4]–0007– */

发表评论

电子邮件地址不会被公开。 必填项已用*标注