pythonで多次元配列の要素に対して四則演算した時の意図せぬ挙動

numpyを使わずに多次元配列を作って、その要素に対して四則演算してみたら

a = [[0] * 5] * 5
a[0][0] += 1
print(a)
# out:[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

みたいになった

想定としてはこんな感じ↓

# out:[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

どうやらpythonで初期化をする時に*を使うとポインタを複製してしまうらしい。

なので、こんな感じで一つ一つ初期化したらうまくいったよというメモ

b = [
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
]
b[0][0] += 1
print(b)
# out:[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]