Python循环追加字典至列表时元素重复最后值的问题求助
问题分析与解决方案
这个问题我之前也碰到过,核心原因是Python中字典是可变对象,你在循环里写的dataT = dataTemplate根本没有创建新的字典实例——它只是让dataT指向了dataTemplate所在的内存地址。也就是说,每次循环你修改的都是同一个字典对象,最后listToSave里的所有元素其实都是对这同一个字典的引用,自然所有元素的id都会变成最后一次生成的UUID。
解决方法:使用深拷贝创建独立的字典实例
因为你的dataTemplate是嵌套结构的字典,普通的浅拷贝(比如dataTemplate.copy())只会复制外层字典,内部的嵌套字典还是共享引用,所以必须用深拷贝来递归复制所有嵌套的可变对象。具体步骤如下:
- 首先导入
copy模块:
import copy import uuid
- 修改循环中的字典赋值逻辑,每次循环都生成
dataTemplate的深拷贝:
listToSave = [] for i in range(len(ffts)): # 每次循环创建一个完全独立的dataTemplate副本 dataT = copy.deepcopy(dataTemplate) dataT['aClip']['info']['id'] = str(uuid.uuid4()) # 这里添加你需要的其他操作 print(dataT['aClip']['info']['id']) listToSave.append(dataT) print('Data formated - Ready to save')
原理说明
深拷贝(copy.deepcopy())会递归遍历原字典的所有嵌套结构,为每一层的可变对象(比如内部的info字典、t字典等)都创建新的实例,这样每个dataT都是完全独立的,修改其中一个不会影响其他元素。
修改后再打印listToSave里的各个元素id,就能看到每个都是不同的UUID了。
内容的提问来源于stack exchange,提问作者Diego Aguilera
相关产品推荐
相关产品推荐

