多重配列を作ったら、以下のように配列の中身がへんてこになってしまった。
1 2 3 4 |
a =[[0] * 3] * 5 # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] a[1][1] = 1 # [[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]] |
コレ、5つの[0, 0, 0]がaの中にあるように見えるけど、実は1つの[0, 0, 0]が実体として存在しているだけで、どの要素も同じ[0, 0, 0]を指しているっていう状況になっている。
結果、a[1][1]の値を1に書き換えたとしても、5つの要素は変わらず同じ[0, 1, 0]を参照するから、上のようなへんてこな結果になるというわけだ。
まぁ詳しい説明は下の参考リンクに任せるとして、正しく多重配列を作成するためには以下のようにリスト内包表記を使えばよい。
1 2 3 4 |
a = [[0 for _ in range(3)] for __ in range(5)] # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] a[1][1] = 1 # [[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] |
##こんなコードがあったとさ(1)```py3a = 1b = a# 後からaの値を変更したくなったa = 2print(a, b)```###実行結果```2 1```普通ですね。##こんなコードがあっ... Python のリストの扱いで注意すること - Qiita - Qiita |