Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

PythonのTypeError: unhashable type: 'set'とは何ですか?

f:id:kenken0326:20210616102628p:plain

こんにちはPyQサポートです。
今回は「TypeError: unhashable type: 'set'」というエラーの意味と考えられる原因を紹介します。

質問:TypeError: unhashable type: 'set'とは何ですか?

辞書を作成しようとした時にTypeError: unhashable type: 'set'というエラーが出ました。
これはどんなエラーですか?

入力した内容(コード)

users = {"キューちゃん", "パイ先輩"}

groups = {
    users: "PyQ",
}

出たエラー(実行結果)

Traceback (most recent call last):
  File "set_method_add.py", line 3, in <module>
    groups = {
TypeError: unhashable type: 'set'

回答:ハッシュ可能でない「集合(users)」を辞書のキーにしようとしているので、エラーになりました

ハッシュ可能でないオブジェクトである「集合(users)」を、辞書(groups)のキーにしようとしているので、エラーになりました。

ハッシュ可能なオブジェクトとは、hash(オブジェクト)がハッシュ値を返すように実装されているオブジェクトです。

一般的に、変更可能なオブジェクトはハッシュ可能ではありません。

ハッシュ可能なオブジェクト

  • 数値
  • 文字列
  • ハッシュ可能なオブジェクトを要素に持つタプル

ハッシュ可能ではないオブジェクト

  • 集合
  • リスト
  • 辞書

TypeError: unhashable type: 'set'の解説

辞書のキーは、数字や文字列のようにハッシュ可能でなければなりません。
集合(set)のように、ハッシュ可能でないオブジェクトを辞書のキーにしようとすると、このエラーが発生します。

また、辞書のキーだけでなく、集合の要素もハッシュ可能でないといけません。
集合の要素に、ハッシュ可能でないオブジェクトを追加しようとした場合もこのエラーが発生します。

集合の要素が集合になっている例

>>> {{"aaa", "bbb"}, {"ccc", "ddd"}}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

TypeError: unhashable type: 'set'が出る時にチェックするといい、よくあるミス

  • 辞書のキーがハッシュ可能になっているか
  • 集合の要素がハッシュ可能になっているか

類似エラーの紹介

TypeError: unhashable type: 'dict'

「ハッシュ可能でない辞書」を辞書のキーに設定している時などにこのエラーが表示されます。

辞書を集合の要素にしている例

>>> {{"aaa": 1, "bbb": 2}}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

TypeError: unhashable type: 'list'

「ハッシュ可能でないリスト」を辞書のキーに設定している時などにこのエラーが表示されます。

リストを集合の要素にしている例

{["aaa", "bbb"], ["ccc", "ddd"]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Copyright ©2017- BeProud Inc. All rights reserved.