为什么修改数组副本会影响原始?

时间:2013-04-01 15:34:46

标签: python list

大家好,我很抱歉,如果这是一个菜鸟问题,但我使用python,我有一个问题,我复制一个数组但是当我修改副本时,它会影响原始。我想在边界矩阵中添加一个线性偏移到一组坐标:

boundaries = [[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]]

xyzCoord = [[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ...

extraX=[]
for i in range(0,len(xyzCoord)):
    toAdd=[]
    toAdd=xyzCoord[i]
    toAdd[0]=toAdd[0]+boundaries[0][0]

print xyzCoord

我期望的输出是xyzCoord不应该受到影响因为我复制(toAdd)然后修改它。奇怪的是,这个循环确实影响了我的xyzCoord:

输出结果为:

[[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]]

[[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ...

[[5.818, 0.0, 0.0], [8.727, 2.909, 0.0], ...

编辑:对于上下文,我的想法是,我想最终使用转置值创建一个单独的列表,然后最终创建一个插入列表,但这部分让我振作起来。即我希望创建:    [[0.0,0.0,0.0],[5.818,0.0,0.0],[2.909,0.0,0.0],[8.727,2.909,0.0] ......] 然后为Y和Z做一个更大的循环。这样我就可以在X Y和Z中传播一些坐标并且任意次数。

3 个答案:

答案 0 :(得分:7)

这是关于Python最令人惊讶的事情之一 - =运算符永远不会复制任何东西!它只是为现有对象附加一个新名称。

如果要复制列表,可以使用列表的一部分;切片操作符 进行复制。

toAdd=xyzCoord[i][:]

您还可以使用copy module中的copydeepcopy制作对象的副本。

答案 1 :(得分:1)

toAdd不重复。以下内容使toAdd引用与xyzCoord[i]相同的子列表:

toAdd = xyzCoord[i]

当您更改toAdd的元素时,xyzCoord[i]的相应元素也会发生变化。

而不是上述内容,请写:

toAdd = xyzCoord[i][:]

这将制作(浅)副本。

答案 2 :(得分:0)

因为您使用数组数组(列表列表),内部列表是一个对象,所以您只复制内部对象的引用而不是复制值。