Python中append重复添加同一数据问题求助
问题分析与解决方案
嘿,这个问题我之前也踩过坑!核心原因其实很简单:你从头到尾都在复用同一个gameInfo字典对象。
你每次调用gameInfo.update(...)只是修改这个字典里的内容,而finalPush["games"].append(gameInfo)添加的是这个字典的引用,不是它的副本。所以当循环结束时,列表里的6个元素其实全都是指向同一个字典对象,自然显示的都是最后一次修改后的那场赛事信息。
解决办法:每次循环创建新的字典
把gameInfo的模板定义移到while循环内部,让每次循环都生成一个全新的字典实例,这样每场赛事的信息都会存在独立的对象里。
修改后的代码如下:
def add_game_info_to_json(): finalPush = {"games": []} with open('teamMaster.json') as f: data = json.load(f) i = 0 z = 0 while i < (len(teams_list)/2): # 关键修改:每次循环都新建一个gameInfo字典实例 gameInfo = { "teamHome": "", "teamAway": "", "recordHome": "", "recordAway": "", "colorHome": "", "colorAway": "", "line": "", "overunder": "", "homeTextColor": "", "awayTextColor": "", "homeIndex": "", "awayIndex": "", "time": "" } gameInfo.update(time = game_status_list[i]) gameInfo.update(teamAway = teams_list[i+z]) gameInfo.update(recordAway = records_list[i + z]) gameInfo.update(line = betting_list[i + z]) for team in data: if team == gameInfo["teamAway"]: gameInfo.update(colorAway = data[team]["color"]) gameInfo.update(awayTextColor = data[team]["textColor"]) gameInfo.update(awayIndex = data[team]["index"]) z += 1 gameInfo.update(teamHome = teams_list[i+z]) gameInfo.update(recordHome = records_list[i + z]) gameInfo.update(overunder = betting_list[i + z]) for team in data: if team == gameInfo["teamHome"]: gameInfo.update(colorHome = data[team]["color"]) gameInfo.update(homeTextColor = data[team]["textColor"]) gameInfo.update(homeIndex = data[team]["index"]) print(gameInfo) i += 1 finalPush["games"].append(gameInfo) print(finalPush)
为什么这样能解决问题?
每次进入循环,都会生成一个全新的gameInfo字典,这个字典和之前循环里的字典是完全独立的对象。当你把它append到finalPush["games"]里时,添加的是这个新字典的引用,每场赛事的信息都会被单独保存,不会被后续循环的修改覆盖。
另外提一句,你代码里的z变量逻辑有点绕,不过这不是导致重复的原因,如果后续想优化代码,可以考虑用更清晰的方式来遍历赛事数据,但先解决当前的核心问题就好啦。
内容的提问来源于stack exchange,提问作者GERG
相关产品推荐
相关产品推荐

