为什么我在复制的多级数组上执行的操作会影响原始数组?

时间:2016-10-24 22:16:45

标签: python arrays debugging

例如,如果我有一个列表

t = [["a","b","c"],["d","e","f"],["g","h","i"]]

我复制了它并将元素[1] [1]更改为“z”,就像这样

t2 = t.copy()
t2[1][1] = "z"

当我打印两个表时,只应更改t2但原始表也会受到影响,为什么会这样?我不确定此问题是否已被提出,所以如果这是一个重复的问题,我很抱歉,但我一直无法理解这一点。感谢。

3 个答案:

答案 0 :(得分:1)

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']]

答案 1 :(得分:0)

在python中,copy()执行浅表副本,请参阅https://docs.python.org/2/library/copy.html

  

浅拷贝构造一个新的复合对象然后(到   尽可能地将引用插入到找到的对象中   原来。

因此,在您的示例中,t2[1]=["j","j","j"]不会影响t,但如果您想要进入下一级别,则需要进行深层复制

答案 2 :(得分:0)

你需要做一个深层复制。试试这个:

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

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