Python中append()方法覆盖已有数据的问题咨询
问题原因与解决办法
问题根源
你遇到的append()后数据被覆盖的问题,核心是重复使用了同一个子列表对象。如果你的代码是在循环外只创建了一次子列表,之后每次循环只是修改这个列表里的元素再append到主列表,那主列表里的所有子元素其实都是指向同一个子列表的引用。因为列表是可变对象,最后一次修改会同步到所有引用的位置,看起来就像之前的数据被覆盖了。
而用data += data_row时,会把data_row里的元素直接平铺添加到主列表,自然没法保留子列表的嵌套结构。
解决办法
1. 修复append()的覆盖问题
每次循环时新建一个子列表,不要复用同一个对象。这样append的都是独立的新列表,不会互相影响。
举个实际代码例子:
假设你的原始玩家数据是:
players = [ {"name": "Doe", "first_name": "John", "player_id": 1}, {"name": "Smith", "first_name": "Jane", "player_id": 2}, {"name": "Brown", "first_name": "Mike", "player_id": 3} ]
错误写法(导致覆盖):
data = [["name", "first_name", "player_id"]] data_row = ["", "", ""] # 循环外仅创建一次子列表 for player in players: data_row[0] = player["name"] data_row[1] = player["first_name"] data_row[2] = player["player_id"] data.append(data_row)
正确写法(每次循环新建子列表):
data = [["name", "first_name", "player_id"]] for player in players: # 每次循环都生成新的子列表 data_row = [player["name"], player["first_name"], player["player_id"]] data.append(data_row)
运行后得到的data就是你需要的嵌套列表:
[ ["name", "first_name", "player_id"], ["Doe", "John", 1], ["Smith", "Jane", 2], ["Brown", "Mike", 3] ]
2. 修正+=方式的结构问题
如果想用+=实现追加子列表,需要把data_row包装成一个列表再添加,这样就不会平铺元素:
data = [["name", "first_name", "player_id"]] for player in players: data_row = [player["name"], player["first_name"], player["player_id"]] data += [data_row] # 将data_row作为单个元素的列表追加
这样得到的结果和append的正确写法完全一致。
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

