- 引用计数机制
1.引用计数机制
python里每一样东西都是对象,它们的核心是一个结构体–pyobject
PyObject是每个对象必有的内容,其中ob-refcnt就是作为引用计数,当一个对象有了新的引用时,其obrefcnt就会增加,当其引用对象被删除时,就会减少
当引用计数也就是obrefcnt为0,该对象的生命就结束了
当一个对象引用次数为0,也就是没有引用时,内存便直接释放
import sys
#sys.getrefcount()--获取对象被引用的次数
a=[]
b=a#赋予地址也算
print(sys.getrefcount(a))#3
#只要是传递引用也算是引用了a
c = b
d = b
e = c
print(sys.getrefcount(a))#6
但是当循环引用时,可能会导致占用的内存永远无法被回收,因此要引入标记清除和分代收集的机制
2.标记-清除机制
import gc
gc.collect()#手动释放内存
3.数代回收机制
4.GC模块
GC负责的主要任务:
1.为新生成的对象分配内存
2.识别垃圾对象
3.从垃圾对象那回收内存
gc模块的自动垃圾回收触发机制:
5.小整数与大整数对象池
python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。
Python对小整数的定义是【-5,256】,这些对象是提前建立好的,不会被垃圾回收
a=140
b=140
print(id(a))#1560871008
print(id(b))#1560871008
del a
del b
c = 140
print(id(c))#1560871008
上述代码证明了小整数会被分配在一个固定内存空间中,每次都从对应地址拿出
大整数池:
biga=14000
bigb=14000
print(id(biga))#57294512
print(id(bigb))#57294512
del biga
del bigb
bigc = 14000
print(id(bigc))#57294512
大整数池与小整数池的区别是:
1.从结果看是一样的
2.大整数池是没有提前的创建好对象,是个空池子,需要我们自己去创建。创建好后,会把整数对象保存到池子里面,后面都不需要再创建,直接拿来使用
3.小整数池则是提前把[-5,256]的数据都提前创建好
6.命令行参数
sys模块
argparse模块
import argparse
#创建一个解析器对象
parse = argparse.ArgumentParser(prog='my - my program',usage='%(prog)s [options] usage',
description='my-编写的自定义命令行文件',epilog='my - epilog')
#打印命令行文件
#print(parse.print_help())
'''
usage: my - my program [options] usage
my-编写的自定义命令行文件
optional arguments:
-h, --help show this help message and exit
my - epilog
None
'''
#添加位置参数【必选参数】-- 必须在调用时传入
parse.add_argument('name',type=str,help='your name')
parse.add_argument('age',type=str,help='your age')
#可选参数(前面有 - )-- 可以传也可以不传,传入时要加上前缀,如-s,-c
parse.add_argument('-s','--sex',type=str,help='your sex')
#限定参数范围
parse.add_argument('-c','--class',default='3班',choices=['1班','2班','3班'],type=str,help='your class')
#使用变量接收解析参数
result = parse.parse_args()#解析参数
print(result)
print(result.name,result.age,result.sex)
#调用方法:python 命令行参数.py jey 30
#输出:Namespace(age='30', name='jey', sex=None)
#模拟系统登陆
parse = argparse.ArgumentParser(prog='系统登录',usage='%(prog)s [options] usage',
description='系统自定义命令行的文件',epilog='my - epilog')
#添加位置参数
parse.add_argument('loginType',type=str,help='登录系统类型')
#添加可选参数
parse.add_argument('-u',dest='user',type=str,help='your username')
parse.add_argument('-p',dest='pwd',type=str,help='your password')
result = parse.parse_args()
if(result.user == 'root' and result.pwd == '111111'):
print('login sucess!')
else:
print('login fall')