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



