如果我对一个变量进行rassign,它之前引用的对象是否会被删除?

时间:2018-01-24 13:38:34

标签: python memory-management garbage-collection

如果我要跑

class Myclass():
    def __init__(self, value):
        self.value = value

var1 = Myclass(1) # initializes the first instance of Myclass
var1 = Myclass(2) # initializes the second instance of Myclass

Myclass的第一个实例会在内存中徘徊吗?垃圾收集器(?)会释放空间吗?我是否必须在运行时调用del var1以正确释放内存?

我的问题的背景是我运行一个大循环,在每次迭代中我需要一个特定类的不同实例。虽然我现在明确地调用del,但知道默认行为会很好。

2 个答案:

答案 0 :(得分:3)

TL; DR:使用新对象覆盖var1将减少var1引用的原始对象的引用计数器。 如果对象的引用计数为零,则对象将被销毁(根据this answer)。

实际的答案要比这复杂得多,而且我认为我不太愿意深入研究解释(希望有人会介入或指出你另一个问题,我相当肯定这个是重复的。)

问题是,Python的垃圾收集器依赖于实现,即使在一个实现中,它也可以采用不同的策略。

答案 1 :(得分:1)

当您声明一个新实例时,您将获得不同的内存空间,您可以通过id()内置函数进行简单检查。

In [2]: id( Myclass(1))
Out[2]: 4481511576

In [3]: id( Myclass(1))
Out[3]: 4481591488

所以,回到你的问题,如果你在循环中多次运行。你每次都必须分配/释放内存!遗憾的是,如果你真的想保持加速。你可以通过定义__slots__来使你的对象尽可能简单,以保持你的对象简单,甚至可以飞!检查此how to play with slots