pythonに限った話ではないが、配列の仕様で躓いたのでメモ
やりたいこと
二次元配列を作って右下端の要素だけ初期条件を与えたい
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
→[[0, 0, 0], [0, 0, 0], [0, 0, 10]]
としたかった
失敗した書き方
memo = [[0] * 3] * 3
memo[2][2] = 1
print(memo)
この書き方だと出力は
[[0, 0, 10], [0, 0, 10], [0, 0, 10]]
になる
同じ配列を参照した二次元配列になっており、参照しているうちの1つを変更すると全部の配列が変更される
気づいた時には、ミュータブルなデータ型の特徴でやったところだ!と感動していた
この場合の正解
memo = [[0] * 3 for i in range(3)]
memo[2][2] = 10
print(memo)
リスト内包表記で別々の配列を3つ作る
そうすると出力は
[[0, 0, 0], [0, 0, 0], [0, 0, 10]]
になる
やりたかったことができた
文字列(イミュータブル)の場合
文字列のようなイミュータブルなデータ型では
a = "dog"
b = a
a = "cat"
print("a:", a, ", b:", b)
出力は
a: cat , b: dog
bに代入時点でのデータがそのまま入っていることがわかる
まとめ
日記にしてみると簡単な内容だが、気づくまで小一時間かかった
「思わぬバグの原因になる」とテキストに書いてあった通りでうける
このめんどくささを糧に、配列を初期化するときはちゃんとリスト内包かfor文で書く癖をつけようと思いました
以上