变量重置中的Python垃圾收集发生

时间:2014-06-03 20:28:17

标签: python garbage-collection

在python中假设有人执行以下操作:

# var is a variable, ClassName is the name of a class

var = ClassName(<params...>) # instatiate class to var 
var = ClassName(<params...>) # reset variable to new instance

# or in loop

while 1:
    var = ClassName(<params...>)
    # use var ...

我的问题是,前一个实例什么时候收集垃圾? 它是在创建下一个实例之前或之后发生的吗?

2 个答案:

答案 0 :(得分:2)

请记住(定期)垃圾收集reference-counting是两种不同的机制。在您的情况下,重新计数是相关的。

ref-count为零的对象立即被释放(无需等待周期性gc运行)。

[正如@delnan指出的那样,ref-counting不是官方的python&#34;功能&#34;,而是具体的CPython的实现细节。然而,值得了解]

在您的情况下,您将获得两个并发的现有对象。这是事情发生的顺序:

a new object is created, and is referenced by name "var"
[you now have one existing object]
while True:
    a new object is created
    [you now have two existing objects]
    it is referenced by name "var" (refcount += 1)
    old object is no longer referenced by name "var" (refcount -= 1)
    old object's refcount is now 0, it gets deallocated
    [you now have one existing object]

如果您只想存在一个并发对象,则可以添加del var作为循环中的第一行。

答案 1 :(得分:1)

在。如果它发生在之前,然后新实例的创建因异常而失败,则该变量将处于某种奇怪的状态,未初始化或引用垃圾。假设一个更智能的Python实现可能会提前收集旧对象,如果它可以证明新对象的创建将起作用并且不再需要旧对象。