当前位置: 首页 > 面试题库 >

复合对象上的python垃圾收集器行为

越胤
2023-03-14
问题内容

如果仍引用了复合对象,python垃圾收集器是否清理复合对象

例如

def foo():
    A = [ [1, 3, 5, 7], [2, 4, 6, 8]]
    return A[1]
B = foo()

A[0]被垃圾收集吗?

有没有办法通过代码确认相同?


问题答案:

没有东西引用列表A嵌套列表A[0],所以是的,它们将从内存中删除。

引用的嵌套列表对象A[1]没有返回到其原始容器的连接。

请注意,不是由垃圾收集器执行此操作。GC仅处理中断循环引用。这种简单的情况完全通过引用计数来处理。

当下foo()的回报,当地的命名空间清理。这意味着A已删除,这意味着列表对象引用计数降至0。这将清除该列表对象,这意味着所 包含的
列表也会看到其引用计数减一。因为A[0]这意味着计数也下降到0并被清除。

对于由引用的列表对象A[1],您现在已有对其的引用B,因此它的计数仍为1,并且仍为“有效”。

要通过代码确认相同的内容,只需使用list带有__del__方法的子类,让我们知道何时删除对象:

>>> class DelList(list):
...     def __del__(self):
...         print 'Deleted {}'.format(self)
... 
>>> def foo():
...     A = DelList([DelList([1, 3, 5, 7]), DelList([2, 4, 6, 8])])
...     return A[1]
... 
>>> B = foo()
Deleted [[1, 3, 5, 7], [2, 4, 6, 8]]
Deleted [1, 3, 5, 7]
>>> del B
Deleted [2, 4, 6, 8]

所有这些都特定于CPython(参考Python实现);其他实施方式可以处理对象的寿命不同(例如做使用垃圾收集器来破坏在扫描对象),但的寿命AA[0]不在这些情况下发生变化;
尽管可能在不同的时间点,GC仍将收集其他实现中的那些。



 类似资料:
  • 有人能给我解释一下原因吗?

  • 问题内容: 这个问题来自Kathy Sierra SCJP 1.6 。有多少对象可以进行垃圾收集? 根据Kathy Sierra的回答,它是。这意味着两个对象可以进行垃圾回收。我已经给出了答案的解释。 但是,为什么不符合垃圾收集(GC)的条件? 何时到达,有多少对象可以使用GC? 答:0 B:1 C:2 D:编译失败 E:不可能知道 F:在运行时引发异常 回答: C是正确的。仅一个CardBoar

  • 这个问题取自凯西·塞拉SCJP 1.6。有多少对象符合垃圾收集的条件? 根据凯西·塞拉的回答,它是。这意味着有两个对象可以进行垃圾收集。我已经解释了答案。但是为什么不符合垃圾收集(GC)的条件呢? 当到达时,有多少对象符合GC条件? A:0 答复: C是正确的。只有一个硬纸板对象(c1)符合条件,但它有一个关联的wrapper对象也符合条件

  • [GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580

  • 问题内容: 我有两节课 假设我在代码中使用对象B [say ],并在最终使用它后将其设置为。我知道B的对象现在可用于垃圾回收了。 我知道在将b设置为null之后,它将 立即有资格 进行垃圾回收吗?但是类型A的对象呢?将B设置为以后,是否可以 立即 将其用于垃圾回收?还是 在B被垃圾回收之后 才有资格 进行 垃圾回收 ? 从理论上讲,在对B进行垃圾收集之前,还有参考吗?因此,SUN JVM编译器将在

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1