forの値でlistにappendすると、中身がすべて最後の値になる

問題

id、x、y 座標を持った辞書型を羅列した リストを作りたいと思っています。
以下のようなレイアウトの dict を羅列したリスト items を作成したいです。
そして、それをjsonで保存したいです。

x, y は連番、 id は x*10 + y とします。

python

template = { 'id': id, # ID (x*10 + y) が入る 'position': { 'x': x, # x 座標が入る 'y': y # y 座標が入る }}

実現したいこと

json

[ { "id": 00, "position": { "x": 0, "y": 0 } }, { "id": 01, "position": { "x": 0, "y": 1 } },...

発生している問題

x, y を 4までの連番とした場合、次のようになってしまいます。
ループ終了時の値がリストのすべての要素にappendされてしまっているように見えます。

json

[ { "id": 44, "position": { "x": 4, "y": 4 } }, { "id": 44, "position": { "x": 4, "y": 4 } },...

該当のソースコード

上の問題が発生するソースコードが次のとおりです。

python

import json template = { 'id': '', 'position': {}} items = [] for i in range(4): for j in range(4): id = i*10 + j x = i y = j elm = template elm['id'] = id elm['position'].update({'x': x}) elm['position'].update({'y': y}) items.append(elm) with open('export.json', mode='w', encoding='utf-8') as f: json.dump(items, fp=f)

試したこと

変数 の id を意識して書き換えた
appendした後に中身が変わってしまったのかと思い、elm = dict(elm) 、ループの最後にdel elmとしたりしてみましたが変化がありませんでした。

補足情報(FW/ツールのバージョンなど)

Python 3.10.6

ご教示よろしくお願い致します。

コメントを投稿

0 コメント