【问题标题】:If I rassign a variable, will the object it referred to before be deleted?如果我重新分配一个变量,它之前引用的对象会被删除吗?
【发布时间】:2018-01-24 13:38:34
【问题描述】:

如果我要跑步

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,但很高兴知道默认行为。

【问题讨论】:

    标签: python memory-management garbage-collection


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 但是当我覆盖对对象的访问(除了直接指针处理)并在旅途中释放该内存时,识别它不是垃圾收集器的工作吗?当然会有一个新的对象被创建,但是第一个对象会在内存中持续存在吗?
      • @Neuneck 第一个实例将使用 GC 的 ref-counter!你不需要关心内存泄漏的问题!
      • @GPhilo 也许没有完整的答案!他/她想提高多生成新对象的速度!
      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2012-02-19
      • 2014-12-21
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多