为什么__del__析构函数信息在我的python程序中显示了两次?

时间:2014-01-10 00:14:04

标签: python

我的代码是这样的。(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项。

3 个答案:

答案 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)

当变量超出范围时,它将被销毁。在这种情况下,它就是程序结束的时间。