2

我认为这是面试中最常见的问题:

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

那么这段代码的输出是什么以及为什么。输出将是什么,为什么?那是因为 a 是列表中对象的引用,然后我们调用 del 方法我们删除了这个引用而不是对象?

4

3 回答 3

5

至少有 2 个对所引用对象的a引用(变量是对对象的引用,它们不是对象本身)。列表中有一个引用,然后是引用“ a”。当 you 时del a,您删除了一个引用(变量a),而不是列表中的引用。

另请注意,Python 不保证__del__会被调用...

于 2012-08-16T15:44:39.927 回答
4

__del__当一个对象被销毁时被调用;这将在从程序的可访问内存中删除对对象的最后可能引用之后发生。根据实施情况,这可能会立即发生,也可能会在一段时间后发生。

a您的代码只是从执行范围中删除本地名称;该对象保留在列表中,因此仍然可以访问。del aa[0]例如,尝试写作。

于 2012-08-16T15:45:59.210 回答
3

从文档:

注意 del x 不直接调用x.__del__()——前者将 x 的引用计数减一,而后者仅在 x 的引用计数达到零时调用。

__del__当垃圾收集器发现要销毁的对象时触发。垃圾收集器将尝试销毁引用计数为 0 的对象。 del只需解耦本地命名空间中的标签,从而减少解释器中对象的引用计数。垃圾收集器的行为在很大程度上被认为是解释器的实现细节,因此不能保证__del__on 对象会以任何特定的顺序被调用,甚至根本不被调用。这就是为什么这段代码的行为是未定义的。

于 2012-08-16T16:04:54.217 回答