人生苦短 我用python
开始愉快的享(代)受(码)时间:
内容参考:
- 对象引用计数增加情况 http://www.cnblogs.com/cwp-bg/p/7376577.html
- 对象引用计数减少情况 http://www.cnblogs.com/cwp-bg/p/7460883.html
引用计数增加的情况:
- 对象被创建:
如果对象被创建后没有引用操作,此时的引用计数是0,MyName()本身不是一个引用。
MyName()
class MyName(object):
pass
print(sys.getrefcount(MyName()))
结果:1
说明:之所以结果为1,是因为sys.getrefcount(MyName())函数也算一个引用。
- 对象被引用
说明:这里 23345455 这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池 这些对象会被自动创建加载到内存中等待调用
以下代码,赋值操作为数据增加了3个引用,sys.getrefcount(b)也增加了一个引用
那为什么sys.getrefcount(c)的结果还是4呢?这是因为当函数执行后,作为参数的引用会自动销毁,所以print(sys.getrefcount(b))在执行完毕后引用就删除了
# 增加了一个引用
a = 23345455
# 增加了一个引用
b = a
# 增加了一个引用
c = b
# 增加了一个引用
print(sys.getrefcount(b)) # 执行完毕后引用销毁,减少一个引用
# 增加了一个引用
print(sys.getrefcount(c))
结果:4,4
注意:每一次赋值都会增加数据操作的引用次数,要记住引用的是变量a,b,c等指向的数据23345455,而不是变量本身。
- 对象被作为参数,传入到一个函数中
print(sys.getrefcount(b)) # 执行完毕后引用销毁,减少一个引用
- 对象作为一个元素,存储在容器中
# 增加了一个引用
a = 23345455
# 增加了一个引用
b = a
list = [a, b] # 增加了2个引用
print(sys.getrefcount(b)
结果:5
引用计数减少的情况:
- 对象的别名被赋予新的对象
a = 23345455 # 增加了一个引用
b = a # 增加了一个引用
print(sys.getrefcount(a))
b = 1.4 # 减少了一个23345455整数的引用
print(sys.getrefcount(a))
结果:3;2
- 对象别名被显示销毁
说明:直接使用del关键字或者del()函数;注意:下述代码手动销毁的是被赋值引用的a,但是在列表里的a不会被销毁
a = 23345455 # 增加了一个引用
b = a # 增加了一个引用
list = [a, b] # 增加了2个引用
del a
print(sys.getrefcount(b))
结果:4
- 一个对象离开它的作用域
说明:a作为参数传递到sys.getrefcount(a)函数中,只在函数中起作用,一旦执行完毕就会销毁
a = 23345455 # 增加了一个引用
b = a # 增加了一个引用
print(sys.getrefcount(a)) # 执行完毕后引用销毁
print(sys.getrefcount(a))
结果:3;3
- 对象所在的容器被销毁,或从容器中删除对象
# 增加了一个引用
a = 23345455
# 增加了一个引用
b = a
list = [a, b] # 增加了2个引用
del list
print(sys.getrefcount(b))
结果:3