frozenset型は、標準のset型の不変バージョンとしてPythonに登場しました。セットを他のsetの要素や辞書のキーとして使用できるようにするために、変更不可能なオプションが必要でした。
実際の問題は、一意性と迅速な存在確認の可能性が必要であり、さらにセットを辞書のキーや他のセットの要素として使用する必要があります。通常のsetは可変であるため、不適切であり、したがってハッシュ可能でもありません。
frozensetは不変(immutable)な集合です。作成後、要素を変更することはできません:追加、削除、または変更することはできません。しかし、frozensetはsetと同じ操作をサポートしますが、変更を伴う操作は除きます。
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset'オブジェクトには'add'属性がありません map_dict = {fs: 'frozen'} # 可能、frozensetはハッシュ可能
frozensetは可変オブジェクト(例えばリスト)を含むことができますか?
いいえ、ハッシュ可能/不変のオブジェクトのみがどのタイプの集合の要素となることができます。frozenset([[], 1])はTypeErrorを引き起こします。通常のsetでも同様です。
frozensetから可変setを取得し、逆にすることはできますか?
両方のタイプは標準のコンストラクタを通じて相互に変換可能です:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
frozensetはadd()やremove()メソッドをサポートしていますか?
いいえ、これらのメソッドは存在せず、呼び出そうとするとAttributeErrorが発生します。frozensetは不変です。
辞書のキーに通常のsetを使用:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
利点:
欠点:
frozensetに変換:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
利点:
欠点: