如果我要跑
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
,但知道默认行为会很好。
答案 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