Python中变量重置时的垃圾回收问题

2 投票
2 回答
1023 浏览
提问于 2025-04-18 08:28

在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

撰写回答