4

大家好,如果这是一个菜鸟问题,我很抱歉,但我使用的是 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。这样我可以在 XY 和 Z 中传播一些坐标以及任意次数。

4

3 回答 3

9

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

如果要制作列表的副本,可以使用列表的切片;切片操作员确实制作了一份副本。

toAdd=xyzCoord[i][:]

您还可以使用copydeepcopycopy模块中复制一个对象。

于 2013-04-01T15:42:19.200 回答
1

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

toAdd = xyzCoord[i]

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

代替上面的,写:

toAdd = xyzCoord[i][:]

这将制作一个(浅)副本。

于 2013-04-01T15:36:28.640 回答
0

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

于 2013-04-01T15:38:22.763 回答