为什么对复制的多级阵列执行操作会影响原阵列?



例如,如果我有一个列表

t = [["a","b","c"],["d","e","f"],["g","h","i"]]
我复制了它并把元素[1][1]改成了"z"像这样
t2 = t.copy()
t2[1][1] = "z"

当我打印两个表时,只有t2应该被改变,但原始表也受到影响,为什么会这样?我不确定这个问题之前是否有人问过,所以我很抱歉,如果这是一个重复的问题,但我一直很难理解这一点。谢谢。

copy执行浅层复制-即,您获得一个指向原始指向的相同"内部"列表的新"外部"列表。如果这不是期望的行为,您可以使用deepcopy代替:

>>> from copy import deepcopy
>>> t = [["a","b","c"],["d","e","f"],["g","h","i"]]
>>> t2 = deepcopy(t)
>>> t2[1][1] = "z"
>>> t
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
>>> t2
[['a', 'b', 'c'], ['d', 'z', 'f'], ['g', 'h', 'i']]

在python中,copy()进行浅拷贝,参见https://docs.python.org/2/library/copy.html

浅复制构造一个新的复合对象,然后(到中找到的对象插入引用原创。

所以在你的例子中,t2[1]=["j","j","j"]不会影响t,但如果你想进入下一个级别,你需要深度复制

你需要做一个深拷贝。试试这个:

import copy
t = [["a","b","c"],["d","e","f"],["g","h","i"]]
t2 = copy.deepcopy(t)
t2[1][1] = "z"

现在t应该有它的原始内容,而t2中的副本受到请求更改的影响

最新更新