我的代码是这样的。(python 2.7 Ubuntu)
class Garbage:
def __init__(self):
pass
def __del__(self):
print "Something in Garbage is destoryed"
def test(self):
print "I'm exist"
item1= Garbage()
item2= Garbage()
print id(item1)
del item1
item2.test()
但结果显示如下:
3074861408
Something in Garbage is destoryed
I'm exist
Something in Garbage is destoryed
为什么“垃圾中的东西被摧毁”会出现两次?我只删了item1, 但不是第2项。
答案 0 :(得分:5)
当Python解释器退出时,任何剩余对象的析构函数可能会或可能不会作为关闭序列的一部分被调用。在这种情况下,item2
恰好被破坏了。
请注意,del
运算符不会调用其操作数的__del__
方法。垃圾收集系统一旦确定对象不再可访问就调用它。在CPython中,一旦对象无法访问,通常会立即发生,但可能会延迟,或者如果解释器从未决定收集时间,则可能永远不会发生。
答案 1 :(得分:1)
item2
也会在脚本完成时被破坏。您可以轻松验证:
class Garbage:
def __init__(self, name):
self.name = name
def __del__(self):
print self.name, "Garbage is destroyed"
def test(self):
print self.name, "exists"
item1 = Garbage("item1")
item2 = Garbage("item2")
print id(item1)
del item1
item2.test()
产地:
python test.py
42948288
item1 Garbage is destroyed
item2 exists
item2 Garbage is destroyed
答案 2 :(得分:-1)
当变量超出范围时,它将被销毁。在这种情况下,它就是程序结束的时间。