答案 0 :(得分:1)
引用计数不会释放该对象,因为它的引用计数永远不会为零。你所拥有的是一个循环引用的例子(其中一个对象包含对自身的引用,或指向另一个指向它的对象,等等),引用计数根本不是解决该问题的正确方法。
(为了真正说明问题,你可能应该将del a
作为最后一行,但我们会让那个幻灯片......)
在任何情况下,这就是为什么Python除了引用计数之外还有一个实际的垃圾收集器,它可以找到并释放无法访问的内存。因此,即使以前称为a
的对象最终也会被收集,它可能不会立即发生。
其他Python实现可能使用不同的内存管理策略。例如,Jython和IronPython分别使用其底层VM,Java虚拟机和.Net CLR的内存管理。
答案 1 :(得分:1)
在Python1.x中,情况看起来像这样
class A: pass
1引用A
a=A()
2个引用A,1个引用A的实例
a.b=a
2个引用A,2引用同一个A
实例del a
引用A,1(不可访问)引用我们的A实例
这就是泄露内存的意思
Python自2000年以来就有了一个循环垃圾收集器,因此这将(通常)找到无法访问的引用并将其释放。