You need to enable JavaScript to run this app. 为何Python中list.append()会同步修改所有列表项?如何实现预期输出?
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中list.append()会同步修改所有列表项?如何实现预期输出?

核心原因

同步修改问题本质是Python可变对象的引用特性:

  • 字典属于可变引用类型,循环中反复修改的是同一个内存地址上的j对象
  • l.append(j)操作只是把这个j对象的内存引用塞进列表,不会自动生成独立的副本
  • 所有列表元素最终都指向同一个j实例,当循环跑到最后一次n=18时,所有列表项的值就会同步变成最终修改后的结果。
修正方法

两种可落地的实现思路:

  1. 每次追加列表元素时,对当前的j做一次深拷贝,确保存入列表的是完全独立的新对象,和原对象后续的修改完全隔离。
    这里不能用普通的浅拷贝,因为你的字典是多层嵌套结构,浅拷贝仅复制最外层结构,内层的嵌套列表、字典仍然会共享引用,依然会出现同步修改的问题。
  2. 放弃复用同一个全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 16:36:04