„Zmražené“ či „zamrzlé“ množiny jsou neproměnnou (immutable) variantou množin. Dá se o nich tedy z větší části říci úplně to samé, co o množinách:
Zmražená množina je neuspořádaná kolekce jedinečných a neměnných (immutable) hodnot.
Narozdíl od množin však tuto kolekci nemůžeme žádným způsobem měnit.
K vytvoření zmražené množiny slouží konstruktor frozenset(ITERABLE)
, který přebírá na vstupu iterovatelný objekt složený z prvků neproměnných (immutable) typů, ze kterých složí výslednou zmraženou množinu:
Vstupem do konstruktoru může být samozřejmě i „obyčejná“ množina – dá se procházet po jejích prvcích plus jsou prvky již automaticky neproměnné a každý je tam navíc již pouze jednou:
Prázdnou zmraženou množinu vytvoříme pomocí funkce frozenset()
:
Žádná odpovídající přímá notace neexistuje, takže se sice upíšeme, ale zase se vyhneme zmatení od množin.
Ačkoli zmražené množiny nepatří mezi sekvence, některé z vlastností mají – díky své struktuře „balíků na hodnoty“ – společné:
Podoba se vztahuje dokonce i na procházení prvků množiny smyčkou for-in, jen je příslušné procházení – podobně jako u slovníků – „náhodné“:
Protože zmražené množiny jsou neproměnný (immutable) datový typ, veškeré množinové operace, které sloužily k přidávání a odebírání prvků, u nich nejsou pochopitelně podporovány. Konkrétně se tedy jedná o následující operace:
add()
, update()
discard()
, remove()
, pop()
, clear()
Ostatně podívejme se na výpis podporovaných atributů u zmražené množiny:
Jinak jsou ovšem zmražené množiny stále ještě množinami, takže podporují všechny množinové operace (jak jsme ostatně viděli ve výpisu na předchozím slajdu), a to v obou jejich variantách – operátorově i množinově. Pro jednoduchost si je pouze shrňme a na použití odkažme k příkladům u množin:
Základní množinové operace:
Dotazy na množiny:
Zjištění nulového průniku (nemá operátorovou variantu):
Jako jedna z mála datových struktur nabízí zmražená množina i vlastní metodu pro tvorbu kopie – copy()
. Narozdíl od slovníku však prvky množiny mohou být pouze hešovatelné, tedy neproměnné (immutable) typy, takže při kopírování nenarazíme na problém s mělkou vs hlubokou kopií: