gpt4 book ai didi

Python:理解对象 __del__ 方法

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:09 25 4
gpt4 key购买 nike

谁能告诉我为什么这段代码会打印“2 1 0 done”而不是预期的输出“0 1 2 done”?据我所知,我们在列表理解过程中创建了一些匿名变量,并且在列表理解发现结束时使用 filo 原则对它们进行了垃圾收集。但是,它们仍然在列表 aa 中被引用,不是吗?在这种情况下,为什么第二个“del a”没有调用 del 魔术方法?

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'

另外,高级问题。请看http://codepad.org/niaUzGEy为什么有5份,3份?这不应该是 1 份吗?为什么是 5 或 3?不知道,这就是为什么要问它;)感谢您的宝贵时间!

最佳答案

您混淆了 del 语句和 __del__ 方法。

del a 只是将名称 a 与其引用的任何对象解除绑定(bind)。 aa 引用的列表未更改,因此所有对象都继续存在。

__del__ 方法仅在对象的最后一个引用被销毁后调用。这可能是在调用 __del__ 之后,但通常不是。

您很少需要使用del。更常见的做法是重新绑定(bind) aa 然后它包含的所有对象都将被释放,如果没有以其他方式引用它们的 __del__ 方法将被自动调用。

此外,您很少需要使用 __del__。对于大多数用途,Python 的对象管理将自动处理清理。将 __del__ 方法添加到类通常不是一个好主意,因为它会干扰垃圾收集器,因此矛盾的是 __del__ 使您的程序更有可能泄漏内存。此外,Python 不保证 __del__ 是否在程序退出时实际被调用,如果确实如此,你可能会发现你不能使用的全局变量不再存在,也不会保证只调用它一次(尽管你必须克服重重困难才能让它调用不止一次)。

简而言之,尽可能避免使用 __del__

关于Python:理解对象 __del__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10635036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com