1 python
任何人都可以形容我为什么这段代码会打印'2 1 0完成'而不是预期输出'0 1 2完成'?据我所知,我们在列表推导过程中创建了一些匿名变量,并且使用filo原理对列表理解无法结束进行垃圾收集.但是,它们仍然在列表aa中引用,不是吗?为什么第二个'del a' 在这种情况下不会调用del magic方法?
class A:
def __init__(self, name):
self.name = name
def __del__(self):
print self.name,
aa = [A(str(i)) for i in range(3)]
for a in aa:
del a
print 'done'
Run Code Online (Sandbox Code Playgroud)
还有,高级问题.请查看http://codepad.org/niaUzGEy 为什么有5份副本,3份副本?这不是一份副本吗?为什么5或3?不知道,那就是为什么要问它;)谢谢你的时间!
你混淆了这个del陈述和__del__方法.
del a简单地从名称a引用的任何对象中取消绑定名称.引用的列表aa未更改,因此对象都继续存在.
__del__仅在对象的最后一次引用被销毁后调用该方法.这可能是在打电话之后,__del__但通常不是.
你很少需要使用del.重新绑定会更常见aa,然后释放它包含的所有对象,如果没有其他引用,它们的__del__方法将被自动调用.
此外,您很少需要使用__del__.对于大多数用途,Python对象的管理将自动处理清理.向__del__类添加方法通常是一个坏主意,因为它可能会干扰垃圾收集器,所以相反自相矛盾的__del__是,程序更有可能泄漏内存.Python也不能保证是否__del__实际上是在程序退出时调用,如果是,你可能会发现你不能再使用的全局变量,也不能保证只调用一次(尽管你必须通过箍来制作它不止一次地称之为.
简而言之,__del__如果可能的话,请避免使用.
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |