You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Game类players字典未被垃圾回收,持续追加问题

问题分析与解决方案

看起来你遇到的核心问题是 Game类的players被定义成了类属性,而非实例属性,这才导致每次创建新实例时玩家数据不断累加,而不是被正确初始化。

为什么会出现这个问题?

当你在类级别定义players = {}时,这个字典是属于Game类本身的,所有Game实例都会共享同一个players字典。也就是说:

  • 第一次创建Game实例时,你往这个共享字典里添加了36个玩家
  • 第二次创建新实例时,你还是在同一个字典里继续追加玩家,所以长度变成72,以此类推

你设置game = None只是让当前实例的引用计数减少,但Game类本身还持有players字典的引用,所以它根本不会被垃圾回收,数据自然会一直累加。

怎么解决?

你需要把players改成实例属性,让每个Game实例拥有自己独立的玩家字典。修改你的Game类,在__init__方法里初始化self.players:

class Game:
    def __init__(self, game_num):
        self.players = {}  # 每个实例单独拥有这个字典
        # 在这里编写填充当前game玩家数据的逻辑,比如从数据库/文件读取等
        # 确保你是往self.players里添加数据,而不是类级别的players

这样每次创建Game(gameNum)时,都会生成一个全新的players字典,不会和之前的实例共享数据,print输出的长度就会稳定在36左右了。

额外小建议

你的文件操作可以用with语句来自动管理文件关闭,这样更安全也更简洁:

with open('playerGames.csv', 'w+') as sheet:
    gameNum = 2018020001
    while gameNum < 2018020015:
        game = Game(gameNum)
        print(len(game.players), end=", ")
        for player in game.players.values():
            # 直接遍历values更简洁,不用通过key再取一次
            for stat in player.values():
                sheet.write(f"{stat},")
            sheet.write("\n")
        gameNum += 1

内容的提问来源于stack exchange,提问作者Cory L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:54