Python元组列表转字典列表时值覆盖问题求助
解决字典引用导致列表元素被覆盖的问题
你遇到的问题本质是可变对象的引用特性——你在循环里一直复用同一个description_sum字典,每次修改它的键值对后,把它的引用添加到列表中。列表里的所有元素其实都指向同一个字典对象,所以当你最后一次修改字典时,所有列表元素都会同步变成这个最终值。
修复方案:每次循环创建新字典
把字典的定义放到循环内部,这样每次迭代都会生成一个全新的字典实例,避免引用复用:
result = ([('A', 210L), ('B', 1L), ('C', 269L)], 3) all_descriptions_sums = [] for desc, num in result[0]: # 每次循环新建一个字典,而非修改同一个 description_sum = { 'description': desc, 'sum': int(num) } all_descriptions_sums.append(description_sum) print(all_descriptions_sums)
执行这段代码就能得到你预期的结果:
[{'description':'A','sum':210},{'description':'B','sum':1},{'description':'C','sum':269}]
更简洁的写法:列表推导式
Python的列表推导式可以帮你更高效地完成这个转换,同时自动避免引用问题:
result = ([('A', 210L), ('B', 1L), ('C', 269L)], 3) all_descriptions_sums = [{'description': desc, 'sum': int(num)} for desc, num in result[0]]
这段代码和上面的循环逻辑完全一致,但更简洁易读,也是处理这类转换的常用方式。
核心知识点回顾
在Python中,字典、列表这类可变对象是通过引用传递的。如果你在循环中反复修改同一个可变对象并添加到列表,列表里的所有元素都会指向这个对象的内存地址,最终所有元素都会显示为最后一次修改的结果。解决这类问题的关键就是:每次迭代创建新的可变对象实例。
内容的提问来源于stack exchange,提问作者neliCZka
相关产品推荐
相关产品推荐

