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
相关产品推荐
相关产品推荐

