请稍侯

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