给出以下代码:
$ 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()
似乎在一次迭代中创建的对象不会被破坏,直到之后在下一迭代中创建的对象被创建。这到底是怎么回事,如果是这样,为什么要这样做呢?我一直认为,一旦迭代完成,所有变量和对象都会死亡(除非其他对象引用了这些对象)。
答案 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__
将会不会被呼叫。