在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 ...
我的问题是,前一个实例什么时候收集垃圾? 它是在创建下一个实例之前或之后发生的吗?
答案 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实现可能会提前收集旧对象,如果它可以证明新对象的创建将起作用并且不再需要旧对象。