Python—垃圾回收机制
如果不垃圾回收会发生什么问题?——内存泄漏
-
不再使用的内存会被一种称为垃圾回收的机制释放
-
python的垃圾回收机制实际上是一个引用计数器+一个循环垃圾收集器来工作
-
垃圾回收器是一段独立的代码,用来寻找引用计数为0的对象
-
垃圾回收器还负责检查虽然引用计数>0但也应该被销毁的对象——循环引用
-
循环引用发生在至少有两个对象互相作用,垃圾回收器也会清理为引用的循环
- python解释器会跟踪对象的引用计数,垃圾回收器负责释放内存
增加引用计数:
- 对象被创建或者将其引用赋值,引用计数就被设置为1
- 对象被创建
- 另外的别名被创建
- 被作为参数传递给函数
- 成为容器对象的第一个元素
减少引用计数:
- 当对象的引用被销毁时,引用计数就会减少
- 本地引用离开了作用范围’
- 对象的别名被显示销毁
- 对象的一个别名被赋值给其他对象
- 对象被从一个窗口对象中移除
- 窗口对象本身被销毁
1 import sys 2 print(sys.getrefcount(5001111)) 3 a = 5001111 4 print(sys.getrefcount(5001111)) 5 b = a #增加引用,<5001111>的计数 6 print(sys.getrefcount(5001111)) 7 c = [b] #增加引用,<5001111>的计数 8 print(sys.getrefcount(5001111)) 9 def A(a): 10 print('in A, count:', sys.getrefcount(a)) 11 print('pre A, count:', sys.getrefcount(a)) 12 #一个函数A的参数a的引用,再一个是函数栈保存了入参对a的引用 13 A(a) 14 print('end A, count:', sys.getrefcount(a)) 15 #函数引用完之后减少引用计数 16 del a #减少引用<5001111>的计数 17 print(sys.getrefcount(5001111)) 18 b = 100 #减少引用<5001111>的计数 19 print(sys.getrefcount(5001111)) 20 c[0] = -1 #减少引用<5001111>的计数 21 print(sys.getrefcount(5001111))
输出结果

__del__语句:
析构方法,当对象在内存中被释放时,自动触发执行
注:此方法一般无须定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。


浙公网安备 33010602011771号