我试图在python中从内存中删除一个对象,但是遇到了一个没有被删除的对象。据我所知,如果没有对对象的引用,垃圾回收器将在运行时取消分配内存。但是在我删除了所有引用之后,如果我运行bar = Foo()
print gc.get_referrers(bar)
del bar
baz = gc.collect()
print baz
我得到的答复是[< frame object at 0x7f1eba291e50>]
0
那么为什么它不删除对象呢?在
如果我这样做的话,所有对象的实例都会得到相同的答复
^{pr2}$
我如何从一个对象中完全删除所有引用者/知道在all上的frame对象是什么吗?在
我以为是物体框架(?)它包含了程序中所有对象的列表,但我无法确认/找到一种方法来消除对象被所述神秘(对我而言)对象fram的引用。在
任何帮助都将不胜感激
编辑:
好吧,我把代码重写成一个简单的形式,把所有的东西都去掉,除了基本的内容import random, gc
class Object():
def __init__(self):
self.n=None
self.p=None
self.isAlive=True
def setNext(self,object):
self.n=object
def setPrev(self, object):
self.p=object
def getNext(self):
return self.n
def getPrev(self):
return self.p
def simulate(self):
if random.random() > .90:
self.isAlive=False
def remove(self):
if self.p is not None and self.n is not None:
self.n.setPrev(self.p)
self.p.setNext(self.n)
elif self.p is not None:
self.p.setNext(None)
elif self.n is not None:
self.n.setPrev(None)
del self
class Grid():
def __init__(self):
self.cells=[[Cell() for i in range(0,500)] for j in range(0,500)]
for x in range(0,100):
for y in range(0,100):
for z in range(0,100):
self.cells[x][y].addObject(Object())
def simulate(self):
for x in range(0,500):
for y in range(0,500):
self.cells[x][y].simulate()
num=gc.collect()
print " " + str(num) +" deleted today."
class Cell():
def __init__(self):
self.objects = None
self.objectsLast = None
def addObject(self, object):
if self.objects is None:
self.objects = object
else:
self.objectsLast.setNext(object)
object.setPrev(self.objectsLast)
self.objectsLast = object
def simulate(self):
current = self.objects
while current is not None:
if current.isAlive:
current.simulate()
current = current.getNext()
else:
delete = current
current = current.getNext()
if delete.getPrev() is None:
self.objects = current
elif delete.getNext() is None:
self.objectsLast = delete.getPrev()
delete.remove()
def main():
print "Building Map..."
x = Grid()
for y in range (1,101):
print "Simulating day " + str(y) +"..."
x.simulate()
if __name__ == "__main__":
main()