2013-04-01 51 views
4

大家好我很抱歉,如果这是一个noob问题,但我使用python和我有一个问题,我复制一个数组,但然后当我修改它影响原件的副本。我想一个线性从边界矩阵偏移添加到一组坐标: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中传播一些坐标和任意次数。

回答

7

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

如果您想制作一个列表的副本,您可以使用该列表的一部分;切片运算符复制。

toAdd=xyzCoord[i][:] 

您还可以使用copydeepcopycopy module使对象的副本。

+0

感谢您的帮助,这完全奏效! – Coherent

1

toAdd不重复。以下品牌toAdd指同一子列表作为xyzCoord[i]

toAdd = xyzCoord[i] 

当您更改toAdd元素,xyzCoord[i]相应的元素也随之变化。

相反以上,写的:

toAdd = xyzCoord[i][:] 

这将使(浅)副本。

+0

还有'copy.deepcopy()'。 –

+0

你真了不起,非常感谢你! – Coherent

+1

有些人更喜欢显式的'list(xyzCoord [i])',它更像是“构建一个*新的*列表请”,而不是从开始到结束切片的隐式拷贝。前者速度较慢(尽管这很少引起关注)。 – mgilson

0

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