文章目录
1. python内存管理机制(自动)
引用计数:
每个变量存储对象地址时,引用计数都会自增1,
每个变量与对象引用断开时,引用计数都会自减1。
如果引用计数为0,对象被释放。
缺点:循环引用
标记清除:
扫描内存,查看是否存在无法访问的内存空间。
缺点:耗时长
分代回收:
将内存分为"年轻代",“中年代”,“老年代”。
每代内存告急时,都会采用标记清除:将有用的数据升代。
内存优化:
尽少产生垃圾,对象池,手动回收(慎用)
2. 对象池:每次创建对象时,都会判断池中是否具有相同对象
如果有,则直接返回该对象地址
如果没有,则开辟空间创建新对象。
优点:提高内存的利用率
3. 函数参数
实际参数:调用函数时
位置实参:函数名(数据1,数据2)
序列实参:函数名(*序列)
关键字实参:函数名(形参名1=数据1,形参名2=数据2)
字典实参:函数名(**字典)
形式参数:创建函数时
默认参数:def 函数名(形参名1=默认值,形参名2=默认值)
位置形参:def 函数名(形参名1,形参名2)
星号元组形参:def 函数名(args)
命名关键字形参:def 函数名(,形参名1,形参名2)
def 函数名(*args,形参名1,形参名2)
双星号字典形参:def 函数名(**kwargs)
# 1. 引用计数
list01 = [1,2,3]
list02 = list01
list03 = list01
list04 = list01
# 此时列表[1,2,3]对象引用计数为4
list01 = []
# 此时列表[1,2,3]对象引用计数为3
del list02,list03
# 此时列表[1,2,3]对象引用计数为1
list04 = 0
# 此时列表[1,2,3]对象引用计数为0,列表[1,2,3]对象被释放
# str_result = ""
# for item in range(1000):
# # "" "0" --> 产生新对象
# # "0" "1" --> 产生新对象
# # "01" "2" --> 产生新对象
# str_result += str(item)
# print(str_result)
str_result = []
for item in range(1000):
# "" "0" --> 产生新对象
# "0" "1" --> 产生新对象
# "01" "2" --> 产生新对象
str_result.append(str(item))
print(str_result)
# 循环引用
list01 = []
list02 = []
list01.append(list02)
list02.append(list01)
del list01,list02
# 2. 对象池:每次创建对象时,都会判断池中是否具有相同对象
# 如果有,则直接返回该对象地址
# 如果没有,则开辟空间创建新对象。
# 优点:提高内存的利用率
a = ["a"]
b = ["a"]
c = ["a"]
print(id(a),id(b),id(c))