首页 > 解决方案 > 带有字典属性的 Python 对象被附加到每个循环迭代而不是被垃圾收集

问题描述

我创建了一个 Game 类,其中包含玩家的字典属性作为属性,其中应该有大约 36 个玩家。

我正在迭代一个循环,每次迭代都创建一个 Game 对象的新实例,并将每个玩家的内容打印到一个 csv 文件中。

然而,尽管每次迭代都会创建一个新对象,但似乎玩家属性被附加到而不是被垃圾收集。

sheet = open('playerGames.csv', 'w+')
gameNum = 2018020001

while gameNum < 2018020015:

    game = Game(gameNum)

    print(len(game.players), end=", ")

    for player in game.players:
        for stat in game.players[player]:
            sheet.write(str(game.players[player][stat]) + ",")
        sheet.write("\n")
    game = None

    gameNum = gameNum + 1

上面的打印语句每次应该打印一个大约 36 的数字,但是它输出以下内容36, 72, 108, 144, 163, 199, 217, 253, 289, 325, 361, 397, 433, 469

垃圾收集不应该清除这个吗?我添加了该game = None语句,希望收集整个对象,但这似乎不起作用。

标签: pythonpython-3.xobjectgarbage-collection

解决方案


鉴于它players被定义为全局变量,您需要在构造函数中重置,如下所示:

class Game:

    def __init__(self, n):
        players = dict()

在任何语言中,使用全局变量都是一种不好的做法,请参阅this。如果 player 是Game对象的属性,则应改为:

class Game:

    def __init__(self, n):
        self.players = { }  # dictionary construction expression

推荐阅读