2016-06-24 7 views
1

誰もがなぜこれが起こっているのか説明できますか?Python配列の異常な動作?

ケース1:

>>> a = [[0]] *3 
>>> print a 
[[0], [0], [0]] 
>>> a[1].append(0) 
>>> print a 
[[0, 0], [0, 0], [0, 0]] 

ケース2:なぜこれが

>>> a = [[0],[0],[0]] 
>>> print a 
[[0], [0], [0]] 
>>> a[1].append(0) 
>>> print a 
[[0], [0, 0], [0]] 

が起こっていますか?私はケース1の場合の配列の振る舞いがケース2のようになることを期待していますが、それは何らかの理由でではありません。

+0

浅いコピー:あなたは可変タイプを持っているときは、リストの内包表記を使用して、この問題を回避するためにのみ不変タイプ

とスターのフォームを使用する必要がありますか? – Arpan

+4

これらはPythonの 'list'sであり、配列ではありません。 Pythonの文脈では、 'array'は通常、NumPy配列を意味すると解釈されます(ただし、標準ライブラリ' array'モジュールもあります)。 –

答えて

2

を、あなたはリスト[0]を作成し、それを3回重複しています。これは3回繰り返した同じオブジェクトです。最初のケースで

a = [[0] for _ in range(3)] 
3

最初のケースでは、aの3つの要素は、実際には同じリストオブジェクトを参照しています。あなたは自分のIDをチェックすることができます:最初のケースで

>>> id(a[0]) 
4524132472 
>>> id(a[1]) 
4524132472 
>>> id(a[2]) 
4524132472 
+0

また、 '(a [0]はa [1])== True' –

関連する問題