You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python字典修改数组?代码问题排查与修正

问题:列表复制后修改导致原列表被改动

需求说明

根据字典中每个键对应的位置和修改值,基于原始数组生成对应数量的修改后数组。示例如下:
字典与原始列表:

change={'change 1': [(1, 'B'), (3, 'B'), (5, 'B'), (7, 'B')], 'change 2': [(2, 'B'), (4, 'B'), (6, 'B')]}
s=['A', 'A', 'A', 'A', 'A', 'A', 'A']

期望输出两个独立修改后的列表:

['B', 'A', 'B', 'A', 'B', 'A', 'B']
['A', 'B', 'A', 'B', 'A', 'B', 'A']

问题代码及异常输出

编写的Python代码:

change={'change 1': [(1, 'B'), (3, 'B'), (5, 'B'), (7, 'B')], 'change 2': [(2, 'B'), (4, 'B'), (6, 'B')]}
s=['A', 'A', 'A', 'A', 'A', 'A', 'A']
for key in change:
    s1=s
    for n in change[key]:
        s1[n[0]-1] = n[1]
    print(key, s1)
    print(s)

实际输出:

change 1 ['B', 'A', 'B', 'A', 'B', 'A', 'B']
['B', 'A', 'B', 'A', 'B', 'A', 'B']
change 2 ['B', 'B', 'B', 'B', 'B', 'B', 'B']
['B', 'B', 'B', 'B', 'B', 'B', 'B']

原列表s被意外修改,导致第二个修改后的列表不符合预期。

问题原因

Python中,s1 = s 不是创建列表副本,而是让变量s1和s指向同一个列表对象。对s1的修改本质上就是对原列表s的修改,所以第一次循环后原列表已经被改动,第二次循环是基于修改后的列表继续操作,自然得不到正确结果。

正确实现方法

需要为每个循环创建原始列表的独立副本,常见的列表复制方式有三种:

  • 使用切片操作 s1 = s[:]
  • 使用list()构造函数 s1 = list(s)
  • 使用copy()方法 s1 = s.copy()

修改后的代码:

change={'change 1': [(1, 'B'), (3, 'B'), (5, 'B'), (7, 'B')], 'change 2': [(2, 'B'), (4, 'B'), (6, 'B')]}
s=['A', 'A', 'A', 'A', 'A', 'A', 'A']
for key in change:
    # 创建原始列表的独立副本
    s1 = s.copy()
    for n in change[key]:
        s1[n[0]-1] = n[1]
    print(key, s1)
    print(s)  # 此时原列表s保持不变

运行后输出:

change 1 ['B', 'A', 'B', 'A', 'B', 'A', 'B']
['A', 'A', 'A', 'A', 'A', 'A', 'A']
change 2 ['A', 'B', 'A', 'B', 'A', 'B', 'A']
['A', 'A', 'A', 'A', 'A', 'A', 'A']

完全符合预期,每次循环都基于原始列表的副本修改,原列表不会被改动。


内容的提问来源于stack exchange,提问作者ejl62

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:10:38