为什么第一次迭代中的对象在第二次迭代中被删除?

时间:2018-09-30 14:07:23

标签: python iteration python-2.x

给出以下代码:

$ sudo lsof -i -P | grep -i jenkins

我得到以下输出:

class wat():
    def __init__(self):
        self.ok = "ok"
        print "hi"

    def __del__(self):
        print "bye"

i = [1,2,3,4]

for thing in i:
    print thing
    hey = wat()

似乎在一次迭代中创建的对象不会被破坏,直到之后在下一迭代中创建的对象被创建。这到底是怎么回事,如果是这样,为什么要这样做呢?我一直认为,一旦迭代完成,所有变量和对象都会死亡(除非其他对象引用了这些对象)。

3 个答案:

答案 0 :(得分:2)

这是正常现象。每次运行hey = wat()行时,都会创建一个新对象(您得到“ hi”),然后它将替换hey中的旧对象。然后将旧的旧文件销毁,因为没有任何东西可以引用它。 (请注意,如Assignment Statements的Python文档中所述,首先对右边的表达式求值,然后将结果绑定到左边的变量(因此,首先得到一个{{1} },然后再执行hi

很明显,在第一次迭代中,wat()没有定义,因此在bye行之后只有hey

答案 1 :(得分:1)

创建新对象后,将对未引用的旧对象进行垃圾回收,因为只有在当前名称空间中重新使用引用hey之后,才会不再引用旧对象。这会在每个循环中自动发生。

答案 2 :(得分:1)

正如其他社区成员已经解释的那样,hey是对您当前wat实例的唯一引用,并且一旦您重新分配了该引用,先前引用的对象将被垃圾回收。

这是对代码的较小修改,可禁止垃圾回收。除了受教育之外,它实际上没有什么用。

class wat():
    eternal_storage = []

    def __init__(self):
        self.ok = "ok"
        print "hi"
        self.eternal_storage.append(self)

    def __del__(self):
        print "bye"

i = [1,2,3,4]

for thing in i:
    print thing
    hey = wat()

输出:

1

2

3

4

由于wat.eternal_storage拥有曾经创建的所有wat对象,因此重新分配引用hey不会删除对任何wat对象的最后一个引用,而wat.__del__将会不会被呼叫。