質問: 次のように、3*4の二重配列を作り、その1番目の配列の2番目の要素のみを1に変えたい ということをしたいです。 ``` lst=[[0]*3]*4 print(lst) lst[1][2]=1 print(lst) ``` 期待していた出力 ``` [[0, 0, 0], [0, 0, 1], [0, 0, 0], [0, 0, 0]] #1番目の配列の2番目の要素が変わってる ``` 実際の出力 ``` [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]] ``` なぜこのようになるのでしょうか?
回答: リスト `['a', 'b', 'c']` があるとします。リストの中には、文字列 `'a'` や `'b'` が格納されているのでしょうか。 いいえ、違います。`'a'` や `'b'` は別の場所に存在していて、リストの中に格納されているのは、`'a'` や `'b'` の場所(`'a'` や `'b'`への参照)なのです。 `lst=[[0]*3]*4` の場合、`[0]*3` で `[0, 0, 0]` が作られます。 `[[0]*3]` は `[[0, 0, 0]]` ですが、外側のリストには `[0, 0, 0]` それ自身ではなく、`[0, 0, 0]` への参照が入っています。`lst` はこれを`*4` するわけですから、同じリスト `[0, 0, 0]` への参照を四つ持ったリストになります。 ここで、`lst[1][2]=1` すると、たった一つしかないけれども、`lst` の中に4回出てくる `[0, 0, 0]` の最後の要素を `1` に書き換えることになります。 そういうわけで、全ての要素が書き換わってしまうのでした。