Low Level Lovers

The stories of low layer programming and developments.

pythonで多次元配列を初期化するときの罠

休日にpythonでz3と戯れてました。

z3とは全然関係ないのですが、pythonで多次元配列を初期化する場面でこんなコードを書いた。

a = [[]] * 4

そして、値を追加してみる。

for i in range(3):
    a[0].append(i)

以下のようになると思っていたら、なっていなくて、

print(a)

[[0, 1, 2], [], [], []]

こうなっていた。

[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

配列を初期化するとき、4つの要素を空配列の値にしたつもりが、それらは空配列の参照でしかなく、皆同じ空配列を指しているため、全要素に値が追加されてしまった。

初歩的なミスだと思うけど、4時間も無駄にしてしまったので書き留めておく・・・。