python - 带有字典属性的 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
语句,希望收集整个对象,但这似乎不起作用。
解决方案
鉴于它players
被定义为全局变量,您需要在构造函数中重置,如下所示:
class Game:
def __init__(self, n):
players = dict()
在任何语言中,使用全局变量都是一种不好的做法,请参阅this。如果 player 是Game
对象的属性,则应改为:
class Game:
def __init__(self, n):
self.players = { } # dictionary construction expression
推荐阅读
- python - 当试图在1行代码中打印出列表中小于10的元素时,为什么输出的是地址
- python - 从 Python 中的输入创建一个具有两位数值的元组
- java - Math.min 不喜欢以 0 开头的数字。 (0700)
- ruby - Algorithm Ballots cast in an Election
- javascript - React Button 没有显示我声明的文本
- javascript - 重新缩放图像以防止裁剪
- installation - 我想安装一个旧的 godot 引擎
- meteor - 如何自定义使用 Meteor Accounts.ui 发送的 url 忘记密码
- apache-flink - 在 Apache Flink 中处理有害消息
- regex - Bash 脚本错误地将所有字符串与正则表达式匹配