2012-12-28 45 views
-3
>>>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必须是垃圾收集? 如何证明它?垃圾收集何时发生?

+4

你想问什么? – Usman

+1

我真的不知道你在问什么。你介意给你的问题增加一些背景知识,并让问题本身更清楚吗?最好使用* full *句子和动词e.t.c.? – thkala

回答

3

CPython使用reference counting。 Jython和IronPython使用它们的底层虚拟机的GC。话虽如此,CPython实习小型整数,包括在您的代码中使用的小整数,因此那些特别不会被GCed。

2

垃圾收集的工作方式是实现细节。请参阅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()手动关闭文件描述符以防止资源泄漏,直到程序关闭。

3

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)