del命令删除的是对象的引用。当删除的是对象的最后一个引用或无法得到对象时(只存在于两个对象之间的相互引用时,gc会判断两个对象都无法获取进而进行销毁)会导致对象会被当做垃圾回收。
(有个__del__特殊方法,但是它不会销毁实例。它的作用是在Python解释器即将销毁实例时会调用该方法,给实例最后释放外部资源的机会。除非特殊情况一般不要试图实现该方法。)
简单总结:del不会销毁对象实例,但是可能会导致对象不可获取,从而被删除。
bye回调函数会在销毁对象时调用。
上面的例子引出了一个疑问:weakref.finalize函数为了监控对象和调用回调,必须要有引用,那上述例子中的s1对象为什么还是被销毁了?这是应为weakref.finalize函数持有的是s1对象的弱引用。
对象在内存中的存在依赖于引用,但我们有时只需要引用对象一段对象。
弱引用在缓存中很有用,因为我们不想因为被缓存引用着而始终保持缓存对象。
注意不是每个Python对象都可以作为弱引用的目标,这取决于具体Python的解释器。