无法修改数组副本而不改动原数组的Python基础解法求助
问题分析与解决办法
为什么修改newTab会影响原数组?
有两个关键原因:
- 你创建原数组的方式
tab = [[1]*2]*3有问题——这里的*3并不是生成3个独立的[1,1]子列表,而是让tab里的三个位置都指向同一个子列表对象。哪怕你不复制newTab,直接修改tab[0][0],另外两个子列表的对应位置也会跟着变。 - 你用的
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
相关产品推荐
相关产品推荐

