用語比較
dict.get()と setdefault() の違い|辞書に書き込むかどうか(Python3基礎)
辞書からキーの値を取り出し、無ければ既定値を使いたいときに、get() と setdefault() が候補になります。キーがあるときの戻り値は同じです。
違いはキーが無いときで、get() は辞書を変えず、setdefault() は辞書にキーを追加します。
このページは、get() で取ったつもりの値が辞書に残っていなかった人や、setdefault() で辞書が増えて驚いた人向けです。決まりは、Python 公式ドキュメントの組み込み型(辞書)の項に書かれています。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
d.get(key, default)
キーがあればその値、無ければ default を返す。辞書は変わらない。
d.setdefault(key, default)
キーがあればその値を返す。無ければ default を挿入して、その default を返す。
d[key]
キーが無いと KeyError になる。
違いを表で確認
| 比較軸 | d.get(key, default) | d.setdefault(key, default) |
|---|---|---|
| キーがあるとき(d = {"a": 1}、key は "a") | d.get("a", 99):1、辞書は変わらない | d.setdefault("a", 99):1、辞書は変わらない |
| キーが無いとき(key は "b"、既定値は 0) | d.get("b", 0):0、d は {"a": 1} のまま | d.setdefault("b", 0):0、d は {"a": 1, "b": 0} になる |
| 既定値を省略したとき | d.get("b"):None、辞書は変わらない | d.setdefault("b"):None、d に "b": None が入る |
| 向いている用途 | 読むだけ(件数の加算の途中の参照など) | 初期値を入れてから使い続ける(リストへの追加など) |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
get() で取った既定値が、辞書に残っていると思った人
d.get("b", 0) は 0 を返すだけで、d には何も書き込みません。Python 3.9.6 では、実行後の d は {'a': 1} のままでした。公式ドキュメントも、get() は KeyError を起こさないと説明しています。
setdefault() で辞書が勝手に増えて驚いた人
d.setdefault("c") のように既定値を省くと、None を値としてキー "c" が追加されます。Python 3.9.6 で、実行後の d に 'c': None が入りました。読むだけのつもりなら get() を使います。
キーごとにリストを作って追加したい人
w.setdefault("x", []).append(1) と書くと、無ければ空のリストを入れ、そのリストに追加できます。2 回実行すると w は {'x': [1, 2]} になりました。get() では、取ったリストを辞書に戻す処理が別に要ります。
具体例で使い分ける
例 1
同じ引数で、辞書がどう変わるか
d = {"a": 1} に対して、d.get("b", 0) と d.setdefault("b", 0) を順に実行します。
- 公式ドキュメントは、get() をキーがあればその値、無ければ default を返すメソッドと説明しています。
- setdefault() は、キーが無いとき default を値としてキーを挿入し、default を返すメソッドと説明されています。
結論: どちらも 0 を返します。get() のあとの d は {'a': 1} のままで、setdefault() のあとは {'a': 1, 'b': 0} です。Python 3.9.6 で同じ結果を確認しました。
例 2
文字の出現回数を数える
文字列 "abca" の各文字について、x[k] = x.get(k, 0) + 1 を繰り返します。x は空の辞書で始めます。
- 初めて出る文字は get() が 0 を返すので、0 + 1 で 1 が入ります。
- すでにある文字は、現在の回数に 1 が足されます。
結論: x は {'a': 2, 'b': 1, 'c': 1} になります。Python 3.9.6 で同じ結果を確認しました。
問題文から答えを選ぶ手順
- 1
辞書に書き込んでよいかを決める
読むだけで辞書を変えたくないなら get() です。初期値を入れて続けて使うなら setdefault() です。
- 2
既定値の扱いを決める
既定値を省くと、どちらも None になります。setdefault() では、その None が辞書に残ります。
- 3
キーが必ずあるなら d[key] を使う
キーが無いのが異常なら d[key] で KeyError を起こして気づけるようにします。
試験での見分け方
- 1get() は辞書を変えず、KeyError も起こさない。
- 2setdefault() はキーが無いと、既定値を挿入して返す。
- 3キーがあるときは、どちらも辞書の値をそのまま返す。
- 4d[key] はキーが無いと KeyError になる。
誤答しやすい選択肢
get() で取った既定値が辞書に入ったと思う
修正: get() は読むだけです。入れるなら d[key] = 値 か setdefault() を使います。
読むだけのつもりで setdefault() を使う
修正: キーが無いと辞書が変わります。読むだけなら get() にします。
setdefault(key) の既定値の省略を気にしない
修正: 省略すると None の値でキーが追加されます。意図しないキーが増えていないか確かめます。
確認問題
Q1d = {"a": 1} のとき、d.get("b", 0) を実行したあと、d は何ですか?
答え: {'a': 1}
get() は辞書を変えません。
Q2d = {"a": 1} のとき、d.setdefault("b", 0) の戻り値と、実行後の d は何ですか?
答え: 戻り値は 0、d は {'a': 1, 'b': 0}
setdefault() はキーが無いとき既定値を挿入して返します。
Q3d = {"a": 1} のとき、d.setdefault("a", 99) は何を返し、d はどうなりますか?
答え: 1 を返し、d は変わらない
キーがあるときは、既存の値を返して何も挿入しません。
到達チェック
- get() は辞書を変えないと言える
- setdefault() がキーを挿入すると言える
- 既定値を省くと None になると言える
- キーがあるときは両方とも同じ値を返すと言える
関連ページで確認する
同じ資格で次に知りたいこと
- list.append()と insert() の違い|要素を足す位置(Python3基礎)
リストの append() は末尾に1個足し、insert() は指定した位置に足します。Python 公式チュートリアルの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
- reverse()と reversed() の違い|None が返る理由と逆順の取り方(Python3基礎)
リストの reverse() は元のリストを逆順に並べ替えて None を返し、reversed() は元を変えずに逆順のイテレータを返します。Python 公式ドキュメントの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
- strip()と replace() の違い|空白を消す範囲(Python3基礎)
文字列の strip() は両端の文字だけを取り除き、replace() は文字列中の一致をすべて置き換えます。Python 公式ドキュメントの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
よくある質問
Qsetdefault() は get() の上位互換ですか?
違います。辞書を書き換える点が異なるので、読むだけの場面で使うと意図しないキーが増えます。
Q既定値を省略するとどうなりますか?
公式ドキュメントでは、どちらも default の初期値は None と説明されています。
Qどちらが速いですか?
このページでは速度を比べていません。辞書に書き込むかどうかで選びます。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
