1.1 当有新的引用指向的时候,引用计数+1 1.2 当有无效的引用发生的时候,引用计数-1 1.3 当对象的引用计算为0的时候,销毁对象 getrefcount 会创建一个
>>> from sys import getrefcount >>> a =500 >>> getrefcount(a) 2 实际上应该为1,然后getrefcount也临时引用了,所以为2 >>> b = a >>> getrefcount(a) 3 >>> lst = [a] >>> getrefcount(a) 4 >>> del a del删掉的都是引用,删掉了a的引用 >>> getrefcount(b) 32.引用计数可以解决大部分内存问释放题,但是无法解决循环引用的问题
循环引用 >>> x = [1] >>> y = [2] >>> x.append(y) >>> getrefcount(y) 3 >>> getrefcount(x) 2 >>> y.append(x) >>> getrefcount(x) 3 >>> x [1, [2, [...]]] >>> y [2, [1, [...]]] >>> del x >>> y [2, [1, [...]]] >>> x Traceback (most recent call last): File "二、垃圾回收:解决引用计数无法处理的循环问题 1.垃圾回收的定义:", line 1, in NameError: name 'x' is not defined
垃圾回收时,Python不能进行其它的任务。频繁的垃圾回收将大大降低Python的工作效率。 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的 次数。当两者的差值高于某个阈值时,垃圾回收才会启动
>>> import gc >>> gc.get_threshold() (700, 10, 10)2.三种情况触发垃圾回收
2.1 调用gc.collect() 2.2 GC达到阀值时 2.3 程序退出时3.垃圾回收
3.1 找垃圾–》分代回收
分代机制:
新建对象为0代,0代扫描十次,才会扫描一次1代,以此类推
0代在经历10次垃圾回收依然存活,就会变成1代,以此类推
扫描到了就会进行标记,标记了以后就会进去清除
3.2 清除垃圾–》标记清除–》清除循环引用的垃圾
对于[-5,256] 这样的小整数,系统已经初始化好,可以直接拿来用。而对于其他的大整数,系统则提 前申请了一块内存空间,等需要的时候在这上面创建大整数对象。
>>> a = 1 >>> b = 2 >>> from sys import getrefcount >>> getrefcount(a) 812 >>> getrefcount(b) 99 >>> c=200 >>> getrefcount(c) 3 >>> g = 1 >>> getrefcount(g) 813 >>> a = -5 >>> getrefcount(a) 32、字符串驻留区
多个字符或者含有特殊字符的字符串不会放在驻留区的
>>> str1 ="abc" >>> str2 ="abc" >>> id(str1) 140697336108288 >>> id(str2) 140697336108288 >>> str1 ="abc*" >>> str2 ="abc*" >>> str1 is str2 False五、python内存管理
**引用计数为主,分代回收和标记清除为辅的垃圾回收方式,进行内存回收管理 还引用了小整型缓冲池以及常用字符串驻留区的方式进行内存分配管理**六、深拷贝和浅拷贝(不属于内存管理的内容) 1、深浅拷贝
主要是针对容器类型里面包含可变容器类型--》容器里面包容器2、浅拷贝:只会拷贝第一层的数据地址 3、深拷贝:会拷贝每一层的值
import copy
>>> d1
{'a': [1, 2], 'b': 2}
>>> d2 = d1.copy()
>>> d2
{'a': [1, 2], 'b': 2}
>>> d1
{'a': [1, 2], 'b': 2}
>>> d1 is d2
False
>>> d1['a'].append(3)
>>> d1
{'a': [1, 2, 3], 'b': 2}
>>> d2
{'a': [1, 2, 3], 'b': 2}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4], 'b': 2}
>>> d1
{'a': [1, 2, 3, 4], 'b': 2}
>>> id(d1['a'])
140697298042952
>>> id(d2['a'])
140697298042952
>>> import copy
>>> d3 = copy.deepcopy(d1)
>>> d3
{'a': [1, 2, 3, 4], 'b': 2}
>>> d3 is d1
False
>>> d3['a'].append(5)
>>> d3
{'a': [1, 2, 3, 4, 5], 'b': 2}
>>> d1
{'a': [1, 2, 3, 4], 'b': 2}
>>> lst = [[]]*3
>>> lst
[[], [], []]
>>> lst[0]
[]
>>> lst[0].append(1)
>>> lst
[[1], [1], [1]]



