Python中变量重置时的垃圾回收问题
在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 个回答
1
如果在创建新实例之前发生了某些事情,而新实例的创建又因为错误失败了,那么这个变量就会处于一种奇怪的状态,可能是没有初始化,或者指向一些无效的内容。假设有一种更聪明的Python实现,如果它能证明新对象的创建是可以成功的,并且旧对象不再需要,它可能会提前处理掉旧对象。
4
请记住,垃圾回收和引用计数是两种不同的机制。在你的情况中,引用计数是更相关的。
当一个对象的引用计数变为零时,它会立即被释放(不需要等到定期的垃圾回收运行)。
[正如@delnan指出的,引用计数并不是Python的官方“特性”,而是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
。