Python中打印和向列表追加同一字典变量得到不同值,原因是什么?
问题原因
- Python中字典属于可变对象,你执行
dct[k] = lst[e]时,实际存储的是lst[e]这个字典对象的内存引用,而非独立的副本。 - 你的循环过程中会不断修改
lst[e]本身的键值,所有存入lst2的引用指向的是同一个字典对象,最终打印时所有元素都会显示为最后一次修改后的结果。 - 第一段代码输出正确是因为你每次生成
dct后立刻打印,此时lst[e]还没有被后续循环修改,所以能看到当时的正确值。
修正方案
你只需要在赋值时对字典做一次浅拷贝即可,同时建议不要直接修改原列表的内容,避免原数据被污染,修正后的代码如下:
lst = [{'a' : 1, 'b' : 2, 'c': 3 },{'e' : 1, 'f' : 2, 'g': 3}] e = 0 lst2 = [] while e < len(lst): # 先复制原字典,不修改原数据 original_dct = lst[e].copy() for k in original_dct: dct = {} x = original_dct[k] # 每次计算都用新的副本 temp_dct = original_dct.copy() for key, value in temp_dct.items(): temp_dct[key] = value - x dct[k] = temp_dct lst2.append(dct) e += 1 print(lst2)
运行后输出就和你第一段代码打印的预期结果一致了。
内容的提问来源于stack exchange,提问作者Arober95
相关产品推荐
相关产品推荐

