2017-09-04 22 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'の両方に便利な '.copy()'メソッドがあります。また、**すべてのPythonオブジェクト**がこのように動作することを理解することは非常に重要です。単純にPythonの代入文のセマンティクスです。 Pythonのセマンティクスについて詳しく説明しているNed Batchederの[Pythonの名前と値に関する事実と神話](https://nedbatchelder.com/text/names.html)を参照してください。 –

答えて

0

b = aは、下にあるオブジェクトへの参照をとります。

あなたは浅いコピーを実行します

b = list(a) 

を書きたいです。次にaまたはbを相互に独立して突然変異させることができます。 numpyの場合、これはb = np.array(a)に対応します。または、aがリストであるかNP配列であるかにかかわらず、b = a.copy()を使用してください。

+0

numpy配列でも同じように動作しますか? –

関連する問題