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

无法修改数组副本而不改动原数组的Python基础解法求助

问题分析与解决办法

为什么修改newTab会影响原数组?

有两个关键原因:

  1. 你创建原数组的方式tab = [[1]*2]*3有问题——这里的*3并不是生成3个独立的[1,1]子列表,而是让tab里的三个位置都指向同一个子列表对象。哪怕你不复制newTab,直接修改tab[0][0],另外两个子列表的对应位置也会跟着变。
  2. 你用的newTab[i] = tab[i]或者b[:]都是浅复制:只复制了外层列表里的子列表引用,没有复制子列表内部的元素。所以newTab和tab里的子列表还是同一个对象,改一个就会影响另一个。

纯基础方法的解决方案(不用deepcopy)

先修正原数组的创建方式,再用基础操作完成深复制:

方法1:嵌套循环逐个复制元素

# 正确创建原数组,每个子列表都是独立对象
tab = [[1]*2 for _ in range(3)]
newTab = [None] * len(tab)

for i in range(len(tab)):
    # 为newTab的每个位置创建新列表,逐个复制原数组的元素
    newTab[i] = []
    for num in tab[i]:
        newTab[i].append(num)

newTab[0][0] = 2
print(tab)  # 输出:[[1, 1], [1, 1], [1, 1]]
print(newTab)  # 输出:[[2, 1], [1, 1], [1, 1]]

方法2:利用一维列表切片复制(更简洁)

一维列表的切片[:]会生成新的列表对象,所以可以针对每个子列表用切片完成复制:

tab = [[1]*2 for _ in range(3)]
newTab = [None] * len(tab)

for i in range(len(tab)):
    # 对每个子列表做切片复制,生成独立的新列表
    newTab[i] = tab[i][:]

newTab[0][0] = 2
print(tab)  # 输出:[[1, 1], [1, 1], [1, 1]]
print(newTab)  # 输出:[[2, 1], [1, 1], [1, 1]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:05:22