python的计数引用分析(一)
python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,
对象将被销毁,除了解释器默认创建的对象外。(默认对象的引用计数永远不会变成0)
所有的计数引用+1的情况:
一.对象被创建:
1.a = 23
这里23这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池,-5~256之间的这些对象
会被自动创建加载到内存中等待调用;a = 23是为23这个整数对象增加了一个引用。
执行代码:
>>> import sys >>> a = 23 >>> sys.getrefcount(a)
结果:15
23这个整数对象目前有15个引用。
2.MyName()
class MyName(object):
pass
以上,如果对象被创建后没有引用操作,此时的引用计数是0,MyName()本身不是一个引用。
print(sys.getrefcount(MyName()))
结果:1
说明:之所以结果为1,是因为sys.getrefcount(MyName())函数也算一个引用。
二.对象被引用;
a = 23345455 b = a c = b print(sys.getrefcount(b)) print(sys.getrefcount(c))
结果:4,4
说明:每一次赋值都会增加数据操作的引用次数,要记住引用的是变量a,b,c等指向的数据23345455,而不是变量本身。
三.对象被作为参数,传入到一个函数中;
# 增加了一个引用 a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 c = b # 增加了一个引用 print(sys.getrefcount(b)) # 执行完毕后引用销毁,减少一个引用 # 增加了一个引用 print(sys.getrefcount(c))
说明:以上代码,赋值操作为数据增加了3个引用,sys.getrefcount(b)也增加了一个引用;
为什么sys.getrefcount(c)的结果还是4呢?这是因为当函数执行后,作为参数的引用会自动销毁,所以print(sys.getrefcount(b))在执行完毕后引用就删除了。
四.对象作为一个元素,存储在容器中;
# 增加了一个引用 a = 23345455 # 增加了一个引用 b = a list = [a, b] # 增加了2个引用 print(sys.getrefcount(b)
结果:5
另外还有所有的引用计数减1的情况:python的计数引用分析(二)