为何Python中list.append()会同步修改所有列表项?如何实现预期输出?
核心原因
同步修改问题本质是Python可变对象的引用特性:
- 字典属于可变引用类型,循环中反复修改的是同一个内存地址上的
j对象 l.append(j)操作只是把这个j对象的内存引用塞进列表,不会自动生成独立的副本- 所有列表元素最终都指向同一个
j实例,当循环跑到最后一次n=18时,所有列表项的值就会同步变成最终修改后的结果。
修正方法
两种可落地的实现思路:
- 每次追加列表元素时,对当前的
j做一次深拷贝,确保存入列表的是完全独立的新对象,和原对象后续的修改完全隔离。
这里不能用普通的浅拷贝,因为你的字典是多层嵌套结构,浅拷贝仅复制最外层结构,内层的嵌套列表、字典仍然会共享引用,依然会出现同步修改的问题。 - 放弃复用同一个全局
j对象,每次循环中直接构造独立的目标字典结构追加到列表中,从根源上避免引用共享。
修正代码实现
基于深拷贝的兼容写法
import json import copy a = ''' { "c": { "d": [ { "e": "f" } ] } } ''' j = json.loads(a) l = [] for n in range(20): if n % 2 == 0: j['c']['d'][0]['e'] = n # 追加深拷贝后的独立对象,而非原对象引用 l.append(copy.deepcopy(j)) print(l)
轻量化独立构造写法
l = [] for n in range(20): if n % 2 == 0: l.append({"c": {"d": [{"e": n}]}}) print(l)
两种写法运行后,均可得到和预期完全一致的输出结果。
内容的提问来源于stack exchange,提问作者Dnpsla
相关产品推荐
相关产品推荐

