模块的创建
.py文件就是模块
模块命名遵循普通变量名的命名规则
模块搜索路径方式
1. 程序主目录
2. PYTHONPATH目录(如果已经进行了设置)
3. 标准链接库目录
4. 任何.pth文件的内容(如果存在的话)
#************************************************************************
1. 找到模块文件
2. 编译成位码(需要时)
3. 执行模块的代码来创建其所定义的代码
这三个步骤只有模块第一次导入时才会进行,非第一次导入,会跳过这三个步骤,而只提取内存中已经加载的模块对象
python把载入的模块存储到一个名为sys.modules的表中
import使一个变量名引用整个模块对象
'''
import sys
print(sys.path) #返回模块搜索路径,导入时,Python会自动由左到右搜索这个列表中每个目录。
#from语句会把变量名复制到另一个作用域,它可以使我们直接在脚本中使用复制后的变量名,而不需要通过模块
from sys import path
print(path)
#************************************************************************
#from *语句 会取得模块顶层所有赋了值的变量名的拷贝,该语句只能用在文件的顶部,不能用于函数中
from sys import *
print(path)
#import和from是赋值语句,可以嵌套在if测试中,def中
#import将整个模块对象赋值给一个变量名
#from将一个或多个变量名赋值给另一个模块中同名的对象,而非模块本身
'''
first.py x=1 y=[1,2]
'''
from first import x,y
print(x, y) #1 [1,2]
x=42
y[0]=42
import first
print(first.x, first.y) #1 [42,2] x不是一个共享的可变对象,但y是,所以y的值被更新了,from复制而来的变量名和其来源的文件之间没有联系
first.x=42
print(first.x) #42 要想实际修改另一个文件中的全局变量名,必须使用import
'''
first.py
x=88
def f():
global x
x=x+1
'''
x=11
import first
first.f()
print(x, first.x) #11, 89
#from复制变量名,而不是连接
'''
eggs.py
x=1
def printer():
print(x)
'''
from eggs import x, printer
print(x)
printer()
x=2
print(x)
printer()
#************************************************************************
#命名空间的嵌套
'''
first.py
x=1
second.py
x=2
import first
print(x, end=' ')
print(first.x)
'''
import second #导入second,执行second,输出 2 3
x=1
print(x) #x为当前模块x,输出1
print(second.x) #x为当前模块second的x,输出2
print(second.first.x) #x为当前模块first的x,输出3
#************************************************************************
模块重载
reload函数强制加载已加载的模块的代码重新载入并重新执行,此文件中新的代码的赋值语句会在适当的地方修改现有的模块对象
传给reload的是已经存在的模块对象,而非变量名
import语句 导入的模块,重载后,模块对象编程了新值,因为是通过点号运算符取出属性
from语句 导入的模块,重载后,之前重载的不会受到影响,因为依旧引用重载前取出的旧对象
#过渡性重载
#模块A中导入了模块B,C,重载A则不会重载B和C
#************************************************************************
#import语句和from语句的as扩展
from sys import path as o
print(o) #打印结果为sys.path的值
import eggs as e
print(e) #打印结果为同目录下的eggs.py模块