AI資格ドリル
資格を選ぶ↓

用語比較

setとfrozensetの違い|あとから変更できるか、辞書のキーにできるか(Python3基礎)

setとfrozensetは、どちらも重複のない要素の集まりを表す組み込み型で、作り方も、和集合や積集合の演算も共通です。違いは、作ったあとに中身を変えられるかどうかです。

setは中身を変えられるのでハッシュ値を持たず、frozensetは中身を変えられないのでハッシュ可能で、辞書のキーや別の集合の要素にできると覚えると、選択肢を切り分けられます。

このページは、Python公式ドキュメントの標準型の項と、Python 3.9.6での実行結果をもとに比べます。なお公式チュートリアルの「集合型」の節ではfrozensetは扱われておらず、frozensetの説明は標準ライブラリの組み込み型の項にあります。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

set

変更可能(mutable)。add()やremove()で中身を変えられる。ハッシュ値を持たないので、辞書のキーにも別の集合の要素にもできない。

frozenset

変更不可(immutable)でハッシュ可能。作ったあとは中身を変えられない。辞書のキーや別の集合の要素にできる。

見分け方

「あとから要素を足す」ならset、「辞書のキーにする」「集合の集合を作る」ならfrozenset。

違いを表で確認

比較軸setfrozenset
中身の変更set:add()やremove()などで変更できるfrozenset:作成後は変更できない。add()は呼べない(AttributeError)
ハッシュ値set:ハッシュ値を持たない。hash({1})はTypeErrorfrozenset:ハッシュ可能。辞書のキーや別の集合の要素にできる
リテラルでの作り方set:{'jack', 'sjoerd'} のように波括弧で作れる(空の集合は set() )frozenset:専用のリテラルはなく、frozenset(iterable) で作る
演算と比較set:和・積・差などの演算が使え、その場で更新するupdate()なども使えるfrozenset:和・積・差などの演算は使えるが、中身をその場で書き換えるupdate()などのメソッドはない

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

集合を辞書のキーにしたい人

frozensetにします。setはハッシュ値を持たないので、キーにするとTypeErrorになります。

02

集合の中に集合を入れたい人

内側をfrozensetにします。公式ドキュメントは、集合の集合を表すには内側の集合をfrozensetにする必要があると述べます。

03

要素をあとから足し引きしたい人

setを使います。frozensetには、中身を変えるadd()やupdate()がありません。

具体例で使い分ける

例 1

集合を辞書のキーにする場合

{1, 2} と frozenset({1, 2}) のそれぞれを、辞書のキーにします。

  • Python 3.9.6で {{1, 2}: 0} を実行すると、TypeError: unhashable type: 'set' になります。
  • {frozenset({1, 2}): 0} は実行でき、{frozenset({1, 2}): 0} という辞書になります。
  • 作ったあとで、frozenset({2, 1}) で同じキーの値を取り出すこともできます。集合は順序を持たないので、要素が同じなら同じキーとして扱われます。

結論: 辞書のキーにできるのはfrozensetです。

例 2

要素を追加する場合

{1}.add(2) と frozenset({1}).add(2) を実行します。

  • setの {1}.add(2) は実行でき、Noneを返します(setが変更されるだけです)。
  • frozensetの frozenset({1}).add(2) は、AttributeError: 'frozenset' object has no attribute 'add' になります。

結論: 要素を足せるのはsetだけです。

例 3

setとfrozensetを混ぜて演算する場合

frozenset('ab') | set('bc') と set('ab') | frozenset('bc') の結果の型を調べます。

  • 公式ドキュメントは、setとfrozensetを混ぜた二項演算は、最初のオペランドの型を返すと述べます。
  • Python 3.9.6で調べると、前者はfrozenset、後者はsetでした。
  • また、set('abc') == frozenset('abc') はTrueです。比較は型でなく中身の要素で行われます。

結論: 結果の型は左側で決まり、中身が同じなら等しいと判定されます。

問題文から答えを選ぶ手順

  1. 1

    変更するかを見る

    作ったあとに要素を足し引きするならsetです。

  2. 2

    キーや要素にするかを見る

    辞書のキーにする、または別の集合の要素にするならfrozensetです。

  3. 3

    演算の結果の型を見る

    setとfrozensetを混ぜた演算は、左側の型になります。

試験での見分け方

  • 1setは変更可能でハッシュ値を持たない。辞書のキーにも別の集合の要素にもできない。
  • 2frozensetは変更不可でハッシュ可能。辞書のキーや別の集合の要素にできる。
  • 3集合の集合を作るときは、内側の集合をfrozensetにする。
  • 4setとfrozensetを混ぜた二項演算は、最初のオペランドの型を返す。

誤答しやすい選択肢

frozensetには集合の演算が使えないと考える

修正: 使えます。和・積・差などの演算はfrozensetでも使えます。使えないのは、中身を変える操作です。

空のsetを {} で作れると考える

修正: 空の集合は set() で作ります。{} は空の辞書になります。

中身が同じでも、setとfrozensetは等しくないと考える

修正: set('abc') == frozenset('abc') はTrueです。比較は要素で行われます。

確認問題

Q1辞書のキーにできるのは、setとfrozensetのどちらですか?

答え: frozenset

frozensetは変更不可でハッシュ可能です。setはハッシュ値を持たないのでキーにできません。

Q2集合の集合を作るとき、内側の集合に使う型は?

答え: frozenset

公式ドキュメントは、集合の集合を表すには内側の集合をfrozensetにする必要があると述べます。

Q3frozenset('ab') | set('bc') の結果の型は?

答え: frozenset

setとfrozensetを混ぜた二項演算は、最初のオペランドの型を返します。

到達チェック

  • setは変更可能でハッシュ値を持たないと言える
  • frozensetは変更不可でハッシュ可能と言える
  • 辞書のキーにできるのはfrozensetだけと言える

同じ資格で次に知りたいこと

よくある質問

Qsetとfrozensetの違いは?

A

setは作成後に中身を変更でき、ハッシュ値を持ちません。frozensetは変更できず、ハッシュ可能なので辞書のキーや別の集合の要素にできます。

Qなぜsetは辞書のキーにできないのですか?

A

公式ドキュメントは、setは変更可能なのでハッシュ値を持たず、辞書のキーにも別の集合の要素にもできないと述べます。

Qfrozensetはどう作りますか?

A

frozenset(iterable) で作ります。引数を省くと空のfrozensetになります。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)