大家好,我很抱歉,如果这是一个菜鸟问题,但我使用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中传播一些坐标并且任意次数。
答案 0 :(得分:7)
这是关于Python最令人惊讶的事情之一 - =
运算符永远不会复制任何东西!它只是为现有对象附加一个新名称。
如果要复制列表,可以使用列表的一部分;切片操作符 进行复制。
toAdd=xyzCoord[i][:]
您还可以使用copy
module中的copy
或deepcopy
制作对象的副本。
答案 1 :(得分:1)
toAdd
不重复。以下内容使toAdd
引用与xyzCoord[i]
相同的子列表:
toAdd = xyzCoord[i]
当您更改toAdd
的元素时,xyzCoord[i]
的相应元素也会发生变化。
而不是上述内容,请写:
toAdd = xyzCoord[i][:]
这将制作(浅)副本。
答案 2 :(得分:0)
因为您使用数组数组(列表列表),内部列表是一个对象,所以您只复制内部对象的引用而不是复制值。