2017-09-04 72 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數組一樣工作嗎? –