del a_set删除对对象的引用(局部变量)。C ++对象中还有另一个参考。这称为参考周期。循环GC 可能会
在一段时间后收集此信息。然而,没有保证时(甚至 如果 )出现这种情况,所以你不应该依赖于它1。
例如,含有纯Python对象与参考周期
__del__特殊的方法都记录到不被释放
在所有 :
在版本3.4中进行了更改:在PEP 442之后,带有
__del__()方法的对象gc.garbage不再存在。
我不知道Cython的实现
__dealloc__是否会触发此行为,但是如前所述,销毁无论如何都不是确定性的。如果您要释放一些资源(例如,不是Python对象的内存块,文件,连接,锁等),则应公开一种明确的手动方式(参见
close各种方法)对象)。上下文管理器可以简化客户端代码。
免责声明:几乎所有这些都是CPython特定的。
1有些人更喜欢将GC看作是模拟无限内存可用性的抽象,而不是破坏无法访问的对象的抽象。通过这种方法,很明显破坏不是确定性的,甚至无法保证。



