Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
辞書.copy() / dict() / 辞書のマージ
辞書のコピー・生成・マージを行う方法をまとめています。Python 3.9以降では『|』演算子を使ったシンプルなマージも利用できます。
構文
# 辞書をシャローコピーします。
新辞書 = 辞書.copy()
# キーワード引数や既存の辞書から新しい辞書を生成します。
新辞書 = dict(キー=値, ...)
新辞書 = dict(辞書)
# アンパック演算子で複数の辞書をマージします。
マージ辞書 = {**辞書1, **辞書2}
# | 演算子でマージします(Python 3.9以降)。
マージ辞書 = 辞書1 | 辞書2
関数・演算子一覧
| 関数・演算子 | 概要 |
|---|---|
| 辞書.copy() | 辞書のシャローコピーを作成して返します。元の辞書を変更しても新しい辞書には影響しません(ただしネストした値は共有されます)。 |
| dict(キー=値) | キーワード引数から辞書を生成します。キーは文字列に限定されます。 |
| dict(辞書) | 既存の辞書やイテラブルから新しい辞書を生成します。 |
| {**辞書1, **辞書2} | アンパック演算子を使って複数の辞書をマージした新しい辞書を生成します。キーが重複した場合は後者の値が優先されます。 |
| 辞書1 | 辞書2 | 2つの辞書をマージした新しい辞書を返します(Python 3.9以降)。キーが重複した場合は右側の値が優先されます。 |
| 辞書1 |= 辞書2 | 辞書1に辞書2の内容をインプレースでマージします(Python 3.9以降)。 |
サンプルコード
# copy() でシャローコピーを作成します。
original = {'name': '田中', 'age': 30}
copied = original.copy()
copied['name'] = '佐藤'
print(original['name']) # 『田中』と出力されます。元の辞書は変わりません。
print(copied['name']) # 『佐藤』と出力されます。
# dict() で辞書を生成します。
d1 = dict(name='山田', age=25)
print(d1) # 『{'name': '山田', 'age': 25}』と出力されます。
# アンパック演算子でマージします。
base = {'color': 'blue', 'size': 'M'}
extra = {'size': 'L', 'weight': 60}
merged = {**base, **extra}
print(merged) # 『{'color': 'blue', 'size': 'L', 'weight': 60}』と出力されます。
# | 演算子でマージします(Python 3.9以降)。
d2 = {'x': 1, 'y': 2}
d3 = {'y': 99, 'z': 3}
result = d2 | d3
print(result) # 『{'x': 1, 'y': 99, 'z': 3}』と出力されます。
# |= でインプレースマージします。
settings = {'theme': 'dark', 'lang': 'ja'}
overrides = {'lang': 'en', 'font': 'mono'}
settings |= overrides
print(settings) # 『{'theme': 'dark', 'lang': 'en', 'font': 'mono'}』と出力されます。
概要
『辞書.copy()』はシャローコピーを作成します。辞書の値が文字列や数値などの不変オブジェクトであれば、コピー後に一方を変更してももう一方に影響しません。ただし値がリストや辞書などのミュータブルオブジェクトの場合は参照が共有されるため、深いコピーが必要なときは『copy.deepcopy()』を使ってください。
辞書のマージには複数の方法があります。『{**d1, **d2}』はPython 3.5以降で使え、3つ以上の辞書も一度にまとめられます。Python 3.9以降では『d1 | d2』という直感的な書き方が可能です。いずれの方法でもキーが重複した場合は後から指定した辞書の値が優先されます。意図せず値が上書きされないよう注意してください。
辞書内包表記による生成は『辞書内包表記』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。