def set_if_not_there(d, fields, default_value=None):
for field in fields:
if not field in d:
d[field] = default_value
d = { }
set_if_not_there(d, ['cnt1', 'cnt2'], 0)
set_if_not_there(d, ['tags1', 'tags2'], [])
d['cnt1'] += 1
d['tags1'].append('work')
print d
出力は次のとおりです。
{'tags2': ['work'], 'cnt2': 0, 'cnt1': 1, 'tags1': ['work']}
ご覧のとおり、実際には同じリストを参照していますがtags1
、tags2
これは意図したものではありません。cnt1
正常にcnt2
動作しています。
ミュータブルset_if_not_there
を作成するように実装するにはどうすればよいですか?copies
つまり、デフォルト値が「スカラー」(int、string、None
...) の場合、コピーは必要ありませんが、リストと辞書の場合はコピーが必要です。