はじめに
二次元配列を初期化後、値を入れているはずの行に値が入っていることがあり、調べた末に納得できたので覚書
初めに書いたコード
matrix = [[0] * 3] * 3
matrix[1][1] = False
print(matrix)
# [[0, False, 0], [0, False, 0], [0, False, 0]]
二行目の二番目変えたつもりなのに、一行目と三行目も変わっていて、しばらく悩む。そのうち、[[0] * 3]
が同じオブジェクトのままで3掛けてmatrixに代入しているからと気付き、下に修正する。
修正したコード
matrix = [[0] * 3 for i in range(3)]
matrix[1][1] = False
print(matrix)
# [[0, 0, 0], [0, False, 0], [0, 0, 0]]
リスト内包表記(List comprehensions)で書くと、新しいオブジェクトとして生成されるので想定の挙動にすることができた
おわりに
共有渡しはこういうところでつまづく。引っかかるのはいいとして、すぐ気づけるようになろう
参考