如果不垃圾回收会发生什么问题?--内存泄漏
不再使用的内存会被一种称为垃圾回收的机制释放
python 的垃圾回收机制实际上是 一个引用计数器+一个循环垃圾收集器 来工作;
垃圾回收器是一段独立的代码,用来寻找引用计数为0 的对象;
垃圾回收器还负责检查虽然引用计数>0但也应该被销毁的对象;----循环引用
循环引用发生在有至少两个对象互相引用,垃圾回收器也会清理未引用的循环
python解释器会跟踪对象的引用技术,垃圾回收器负责释放内存
一.关于引用计数
python内部记录所有使用中的对象各有多少引用
增加引用计数:
对象被创建或者将其引用赋值,引用计数就被设置为1
1.对象被创建
2.或另外的别名被创建
3.被作为参数传递给函数
4.成为容器对象的第一个元素
import sys
print (sys.getrefcount(5001111))
a = 5001111
print (sys.getrefcount(5001111))
b = a # 增加引用,<5001111>的计数
print (sys.getrefcount(5001111 ))
c = [b] # 增加引用. <5001111>的计数
print (sys.getrefcount(5001111))
def function(a):
print ('in function, count: ', sys.getrefcount(a))
print ('pre function, count: ', sys.getrefcount(a))
function(a)
print ('end function, count: ', sys.getrefcount(a))
#一个是函数func的参数arg对obj的引用,再一个是函数栈保存了入参对arg的引用。
del a # 减少引用<5001111>的计数
print (sys.getrefcount(5001111))
b = 100 # 减少引用<5001111>的计数
print (sys.getrefcount(5001111 ))
c[0] = -1 # 减少引用<5001111>的计数
print (sys.getrefcount(5001111))
减少引用计数
当对象的引用被销毁时,引用计数就会减少
1.本地引用离开了作用范围
2.对象的别名被显式销毁
3.对象的一个别名被赋值给其他对象
4.对象被从一个窗口对象中移除
5.窗口对象本身被销毁
二. __del__语句
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
class Foo:
def __del__(self):
print ("i will be deleted!")
f=Foo()