Тип frozenset появился в Python как неизменяемая версия стандартного типа set. Было важно обеспечить возможность использования множеств как элементов других set'ов и ключей dict'а — поэтому потребовался иммутабельный вариант.
Практическая задача — нужна уникальность и возможность быстро проверять вхождение, а также использовать множество как ключ словаря или элемент другого множества. Обычный set не подходит, так как является изменяемым и, соответственно, не хэшируемым.
frozenset — неизменяемое (immutable) множество. После создания его элементы нельзя менять: добавлять, удалять или изменять. Но frozenset поддерживает все те же операции, что и set, кроме изменяющих.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # Допустимо, т.к. frozenset — hashable
Может ли frozenset содержать изменяемые объекты (например, список)?
Нет, только хэшируемые/неизменяемые объекты могут быть элементами множества любого типа. frozenset([[], 1]) вызовет TypeError, как и обычный set.
Можно ли получить изменяемый set из frozenset и обратно?
Оба типа можно конвертировать друг в друга через стандартные конструкторы:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
frozenset поддерживает методы add() или remove()?
Нет, эти методы отсутствуют, любая попытка их вызова приведёт к AttributeError, так как frozenset неизменяем.
Использование обычного set как ключа в dict:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
Плюсы:
Минусы:
Преобразование во frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # ОК print(d[frozenset([1, 2])]) # 'value'
Плюсы:
Минусы: