>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a和b可能垃圾收集或a和b必须是垃圾收集? 如何证明它?垃圾收集何时发生?
>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a和b可能垃圾收集或a和b必须是垃圾收集? 如何证明它?垃圾收集何时发生?
CPython使用reference counting。 Jython和IronPython使用它们的底层虚拟机的GC。话虽如此,CPython实习小型整数,包括在您的代码中使用的小整数,因此那些特别不会被GCed。
垃圾收集的工作方式是实现细节。请参阅Python FAQ中的问题“My class defines __del__
but it is not called when I delete the object”。
在CPython中,引用计数是默认值,这意味着对象将在删除最后一个引用时被删除。因此,如果您有一个名为a
的对象,该对象仅在当前范围内引用,则del a
将完全删除它。
但是,CPython还维护一个循环对象列表,以处理reference counting fails的特殊情况。你不知道何时该列表中的对象将被删除,但最终它们会被删除。
在其他Python实现,有可能是所有对象一个完整的垃圾收集器,所以你应该永远依靠del a
实际删除的对象。这也是为什么您应始终使用.close()
手动关闭文件描述符以防止资源泄漏,直到程序关闭。
Python变量只是引用对象的名称。在您的示例中,您有三个对象,即整数4,5和6.
整数6由a引用,5最初由b引用,4由c和d引用。然后你打电话给del(b)
。这将从整数5中删除引用。所以在这一点上,6和4仍然被引用,而5不是。
正好如何处理垃圾回收是一个实现细节。
现在看here:
当前实现保持整数对象为-5和256之间的所有整数数组,当你在这个范围内创建一个int,你其实只是回到现有的引用对象
所以你在这个例子中使用的数字永远不会被垃圾收集。
由于当回收垃圾的gc.set_threshold(threshold0, threshold1, threshold2)
的文档中被描述为:
为了决定何时运行,收集器跟踪自从上次采集数对象分配和释放。当分配数量减去释放次数超过阈值0时,开始收集。最初只检查第0代。如果第1代已经被检查超过阈值1次,那么第1代也被检查。同样,在收集第2代之前,threshold2控制第1代的收集数量。
阈值的标准值是;
In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)
你想问什么? – Usman
我真的不知道你在问什么。你介意给你的问题增加一些背景知识,并让问题本身更清楚吗?最好使用* full *句子和动词e.t.c.? – thkala