首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >清除没有从内存中引用的Python对象

清除没有从内存中引用的Python对象
EN

Stack Overflow用户
提问于 2014-12-20 09:31:44
回答 1查看 246关注 0票数 1

我一直在用Tkinter编写一个非常简单的Python游戏,看看是否可以。有一个包含所有游戏对象的列表,主循环中的每一个滴答都被循环通过,列表中的每个对象都会吸引自己到窗口。

每当用户触发激光时,就会动态地将新的激光对象添加到列表中,而不将其分配给变量。以简化的形式,是这样的:

代码语言:javascript
运行
复制
if buttonIsPressed:
    game.itemlist.append(LaserObject())

当激光自绘制时,它测试它在窗口中的位置,当它到达某个点时,它将自己从列表中删除,不再绘制。它没有其他的引用,但它似乎仍然存在于记忆中。

当发射激光,并因此创造更多的激光对象,程序的内存使用量上升和上升。作为一个测试,我这样做,直到内存使用量达到10 it,然后我让程序在那里坐一个小时,看看那些没有引用的激光物体是否会被垃圾收集,程序的内存使用量会下降,但它从来没有。它正好停留在10 MB。

在这种情况下,我还需要做些什么才能让那些激光物体被正确地收集起来,这样它们就不会继续占用内存,并且程序的整体内存使用可以保持稳定?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-20 21:46:35

事实证明,这个问题与一个标签没有从内存中删除有关。

最初,每个LaserObject内部都有一个标签,用于绘制激光图像。后来,我切换到直接在画布上绘制图像,但是Label对象保留在LaserObject中,没有被正确删除。

当我从LaserObject中完全删除标签时,图像开始像在画布上疯狂地闪烁,可能是因为标签保留了对图像的引用,从而帮助它避免过早收集垃圾或诸如此类的东西。

对于这种情况,最好的解决方案是允许标签保留在LaserObject中,但是在从项目列表中删除LaserObject时添加代码来销毁标签。如下所示:

代码语言:javascript
运行
复制
if laser.y == past_edge_of_window:
    self.game.itemlist.remove(laser)
    self.label.destroy()

这告诉Tk清理标签对象的所有内部代码,并保持内存使用稳定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27578874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档