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 l和del l[:]陈述之间有什么区别?
运行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
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |