您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

没有东西引用列表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仍将收集其他实现中的那些。

python 2022/1/1 18:45:39 有464人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶