Python弱引用
10 September 2015
>>> import weakref
>>> import sys
>>> class Test():
def printT():
print ('this is Test printT')
>>> t = Test()
>>> sys.getrefcount(t)
2
>>> d = t
>>> sys.getrefcount(t)
3
>>> del d
>>> sys.getrefcount(t)
2
>>> r = weakref.ref(t) #没有增加计数
>>> sys.getrefcount(t)
2
>>> r()
<__main__.Test object at 0x0000000003F247F0>
>>> r() is None
False
>>> del t
>>> sys.getrefcount(t)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
sys.getrefcount(t)
NameError: name 't' is not defined
>>> r() is None
True
弱引用的作用,循环依赖问题: 没有使用弱引用:
>>> class A:
def setB(self, b):
self.b = b
>>> class B:
def setA(self, a):
self.a = a
>>> a = A()
>>> b = B()
>>> import sys
>>> sys.getrefcount(a)
2
>>> sys.getrefcount(b)
2
>>> a.setB(b)
>>> b.setA(a)
>>> sys.getrefcount(a)
3
>>> sys.getrefcount(b)
3
使用弱引用:
>>> import weakref
>>> import sys
>>> class A:
def setB(self, b):
self.b = weakref.ref(b)
>>> class B:
def setA(self, a):
self.a = weakref.ref(a)
>>> a = A()
>>> b = B()
>>> sys.getrefcount(a)
2
>>> sys.getrefcount(b)
2
>>> a.setB(b)
>>> b.setA(a)
>>> sys.getrefcount(a)
2
>>> sys.getrefcount(b)
2