概念
什么是强引用和弱引用:
循环引用场景
import objgraph
import gc
# 1,定义2个类
class Person:
pass
class Animal:
pass
# 2,实例化2个对象
p = Person()
dog = Animal()
# 3,让这两个对象之间互相引用,形成循环引用
p.pet = dog
dog.master = p
# 4,尝试删除可到达引用,测试真实对象是否有被回收
# 可到达引用:pet和master是通过p和dog间接来访问的,删除了p和dog,pet和master属性就无法访问
# p dog称为可到达引用,pet master称为不可到达引用
del p
del dog
# 5,通过引用计数器无法回收,可以手动开启垃圾回收机制进行回收
# gc.collect()
print(objgraph.count("Person"))
print(objgraph.count("Animal"))
解决方案
#coding=utf-8
import objgraph
import gc
import time
import weakref
class Person:
pass
class Animal:
pass
p = Person()
dog = Animal()
p.pet = weakref.ref(dog)
dog.master = p
del dog
del p
print(objgraph.count("Person")) # 0
print(objgraph.count("Animal")) # 0