Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Pythonにおける辞書型の結合 dict(d1, **d2) の注意点

ある2つの辞書型のデータd1,d2を結合したいとき、Python3では以下のように書くことができます。

new_d = dict(d1, **d2)# (1)

この記法は特定のキーを記述せずに結合できるので便利なのですが、十分に注意しないといけない処理仕様があります。

以下の例をご覧ください。

d1 = {"a": 1, "b": 2}
d2 = {"b": 12, "c": 13}
print(dict(d1, **d2))
print(dict(d2, **d1))

実行結果は、

{'a': 1, 'b': 12, 'c': 13} #print(dict(d1, **d2))
{'b': 2, 'c': 13, 'a': 1} #print(dict(d2, **d1))

となります。

同じkeyがある場合、キーワード引数である第二引数の辞書型のValueが優先されます。

この仕様を忘れてしまうと思わぬバグに繋がることがあるので注意が必要です。

一方で、

  • 特定のキーを記述せずに結合
  • d1の複数のKeyのValueを一括変更可能

といった特徴から、例えばベースとなる辞書型データconfigに対して、変更項目のみを複数格納した辞書型のデータupdate_configを作り、

new_config = dict(config, **update_config)

といった風に辞書データを更新すると、可読性・保守性の観点でスマートなコードになるような気がします。