在列表上调用'del'

Yip*_*Yay 5 python list del

class ToBeDeleted:
    def __init__(self, value):
        self.value = val

    # Whatever...

    def __del__(self):
        print self.value

l = [ToBeDeleted(i) for i in range(3)]
del l
Run Code Online (Sandbox Code Playgroud)

这打印2, 1, 0.


  • 现在,已删除元素的顺序是在规范中定义的,还是特定于实现的?(或者我可能不了解底层的机制)

  • 例如,输出可以0, 1, 2吗?我意识到2, 1, 0顺序可能是为了避免元素的内存重新分配,同时删除它们,但问题仍然存在.

  • 最后一个 - del ldel l[:]陈述之间有什么区别?

Ray*_*ger 8

运行del l将删除对列表的任何引用,因此符号l将消失.相反,运行del l[:]会删除列表中的内容,将l保留为空列表.

__del__方法是,当最后一个引用的实例被破坏什么运行.

删除顺序未指定,并且是特定于实现的.当你运行时del l,唯一能保证的是列表l及其每个元素的引用计数将减少1.

使用pypy,在垃圾收集器运行之前不会发生任何其他事情.对象删除的顺序取决于GC访问对象的顺序.

cpython中,OP在观察到从右到左发生参考递减时是正确的.在del l[:]这里调用的是用于递减refcounts的代码:http: //hg.python.org/cpython/file/2.7/Objects/listobject.c#l700.当del l被调用时,类似的代码被用于递减引用计数: http://hg.python.org/cpython/file/2.7/Objects/listobject.c#l596