没有东西引用列表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实现);其他实施方式可以处理对象的寿命不同(例如做使用垃圾收集器来破坏在扫描对象),但的寿命A
和A[0]
不在这些情况下发生变化; 尽管可能在不同的时间点,GC仍将收集其他实现中的那些。