我正在编写一个简单的平台游戏,发现在移除“ghost”实例时,它们会继续存在并且无法被垃圾回收。尽管我已经删除了所有引用,但是这些幽灵对象似乎有一些内部引用阻止了它们被垃圾回收。具体来说,它们有一些作为方法开关的属性。
下面的代码展示了我的问题:
import weakref
weak_ghosts = weakref.WeakKeyDictionary()
class Ghost(object):
def __init__(self):
#pass
self.switch = {'eat':self.eat, 'sleep':self.sleep}
def eat(self):
pass
def sleep(self):
pass
ghost = Ghost()
weak_ghosts[ghost] = None
#ghost.switch = {} # uncomment this line and ghost is successfully removed
del ghost
print "number of ghosts =", len(weak_ghosts)
#output:
number of ghosts = 1
问题:
- 到底发生了什么事情?
- 我应该怎么做才能避免这种情况?
- 我是否使用了正确的方法来制作可切换的方法字典?