# 垃圾回收机制详解(了解) # 1、引用计数 # x = 10 # 直接引用 # print(id(x)) # y = x # z = x # # l = ['a', 'b', x] # 间接引用 # print(id(l[2])) # # # # # d = {'mmm': x} # 间接引用 # # # # print(id(d['mmm'])) # # x = 10 # l = ['a', 'b', x] # # l=['a'的内存地址,'b'的内存地址,10的内存地址] # # 注意:上面的x,其实代表的是10的内存地址,所以最后索引到10 # x = 123 # print(l[2]) # print(x) #这个地方输出123表示,x的值又被重新赋值 # x=10 直接引用 # x=[10,] 间接引用 # # l=['a','b',x] 这个处的x值相当于存储的10的内存地址 l1 = [111] # print(id(l1)) l2 = [222] # print(id(l2)) l1.append(l2) # l1=[值111的内存地址,l2列表的内存地址] l2.append(l1) # l2=[值222的内存地址,l1列表的内存地址] # print(id(l1[1])) # id 2591590150400 # print(id(l2)) # id 2591590150400 # print(id(l2[1])) # print(id(l1)) #这个地方的 l1 id是最开始的 l1 = [111]的id ,所以列表相当于索引的内存地址 print(l2) print(l1[1]) del l1 del l2 # 3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率
总结:
上述主要是讲述python通过引用计数的方法,来进行垃圾清理。
引用计数:直接引用 间接引用
问题:若最后一个变量值的引用计数为零,则直接就会被当成垃圾清除掉,但同时还要避免间接引用的情况,也就是循环引用,两个变量值之间进行引用,为了解决,采取了标记----清除 与 分代回收
所以Python引入了“标记-清除” 与“分代回收”来分别解决引用计数的循环引用与效率低的问题,通过寻“根”的方法,(即标记----清除找变量值与变量名联系的那条线),若没有则会被当作垃圾回收掉
# 3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率