引用计数

举个例子说明引用是什么:

a = 1
如上为一个简单的赋值语句,1就是对象,a就是引用,引用a指向对象1。 
同理:
b = 1
b也是对象1的引用。 
通过内置函数id()返回对象的地址。
print id(a) #43220320 print id(b) #43220320
当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。为了检验两个引用指向同一个对象,我们可以用is关键字。is用于判断两个引用所指向的对象是否相同。
print (a is b) #True
在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。赋值语句,只是创造了新的引用,而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。 
可以使用sys.getrefcount()获得引用计数,需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。
from sys import getrefcount

a = [ 1 , 2 , 3 ]
print(getrefcount(a)) # 2

b = a
print(getrefcount(b)) # 3
引用计数增加 
1.对象被创建:x=4 
2.另外的别人被创建:y=x 
3.被作为参数传递给函数:foo(x) 
4.作为容器对象的一个元素:a=[1, x, ‘33’]
引用计数减少 
1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。 
2.对象的别名被显式的销毁:del x ;或者del y 
3.对象的一个别名被赋值给其他对象:x=789 
4.对象从一个窗口对象中移除:myList.remove(x) 
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。