【发布时间】:2017-10-13 19:36:38
【问题描述】:
我制作了一个小型tkinter 游戏,它使用turtle 制作图形。这是对 Cracker Barrel 的 Triangle Peg Game 的模拟,它能够告诉玩家在游戏中的任何时候采取的下一个最佳动作,以及其他功能。钉子只是 turtle.RawPen 的子类的实例,我保留了大量的 RawPen 的普通实例来绘制代表移动的箭头。
我注意到当我重新启动游戏(调用turtle.bye())来杀死海龟窗口时,内存消耗实际上增加了,因为海龟似乎没有被删除。即使我事先调用了window.clear(),在window.__dict__ 中清除了_turtles,仍然有对海龟的引用。我确保在重新启动期间删除了我对它们所做的所有引用,所以这不是问题。有什么方法可以真正删除海龟,以便它可以被垃圾收集?
【问题讨论】:
-
我玩过这个并得出结论,您必须同时调用
window.clear()然后window.bye()才能使单个海龟引用计数降至零。.clear()负责处理window._turtles,.bye()负责处理由像onclick()这样的乌龟事件方法引起的额外引用。无法说出您的其他参考资料来自哪里。 -
我在调试所有使用的海龟时使用了
gc.get_referrers()(我将它们存储在peg_dir、graveyard和artist_dir),唯一的参考是包含它们的列表,window._turtles, 和事件方法。我尝试使用window.clear()清除所有列表,然后使用window.bye(),而gc.collect()表示peg_dir中的对象无法访问。不知道为什么。我会调查的。