Объект Python с атрибутом словаря, к которому добавляется каждая итерация цикла, а не сборщик мусора - PullRequest
1 голос
/ 19 октября 2019

Я создал класс Game, который имеет атрибут словаря игроков в качестве атрибута, в котором должно быть ~ 36 игроков.

Я повторяю цикл, создаю новый экземпляр объекта Game с каждой итерацией и печатаю содержимое каждого игрока в CSV-файл.

Однако при каждой итерации, хотя создается новый объект, создается впечатление, что атрибут player добавляется, а не собирается сборщиком мусора.

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

Приведенный выше оператор print должен печатать число около 36 каждый раз, однако он выводит следующее 36, 72, 108, 144, 163, 199, 217, 253, 289, 325, 361, 397, 433, 469

Если сборщик мусора не прояснит это? Я добавил оператор game = None в надежде, что весь объект будет собран, однако, похоже, это не сработает.

1 Ответ

2 голосов
/ 19 октября 2019

Учитывая, что players определено как глобальная переменная, вам необходимо выполнить сброс в своем конструкторе, что-то вроде этого:

class Game:

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

Использование глобальной переменной - плохая практика на любом языке, см. это . Если игроки являются собственностью Game объектов, вы должны сделать следующее:

class Game:

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