2017-09-04 132 views
0

我熟悉列表和numpy数组有一个奇怪的行为,有几个职位说明原因,但他们没有说如何解决问题的任何事情。Python如何更新循环中的数组和列表

所以,Python的表现是这样的:

`a = [1,2,3]` 
`a` 
`[1,2,3]` 
`b=a` 
`b=[1,2,3]` 
`b` 
`[1,2,3]` 
`b[1] = 84` 
`a` 
`[1,84,3]` 

什么是实现以下行为的最好的解决方法?

`a = [1,2,3]` 
`b=a` 
`b[1] = 84` 
`a` 
`[1,2,3]` 
+0

**所有** Python对象的行为就是这样。这不是'list's或'numpy.array'的一些奇怪细节。如果你想要一个副本,你必须明确地做一个副本。每当你做'a = b'那么* a **是** b * –

+0

'b = a [:]'?很难说。似乎你想修改'b'并让'a'保持不变? – roganjosh

+1

还要注意,'list's和'numpy.ndarray's都有一个方便的'.copy()'方法。而且,理解**非常重要,所有python对象**都是这样运行的,它只是Python中赋值语句的语义。查看Ned Batcheder的[关于Python名称和值的事实和神话](https://nedbatchelder.com/text/names.html),它详细解释了Python中的语义。 –

回答

0

你写了b = a,它引用了底层对象。

你想写

b = list(a) 

将执行浅拷贝。然后你可以互相独立地变异ab。对于numpy,这对应于b = np.array(a)。或者使用b = a.copy(),无论是a是列表还是NP阵列。

+0

它与numpy数组一样工作吗? –