[Python]多重配列の一部を変更しようとしたら、全ての列において変更されてしまって困った
多重配列を作ったら、以下のように配列の中身がへんてこになってしまった。
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]] |
この記事へのコメントはこちら