正确创建frozenset需直接传可迭代对象,如frozenset([1,2,2,3])→frozenset({1,2,3});不可用frozenset(set([...]))套娃,因其冗余、易致顺序误判且不支持add/remove等修改操作。

不可变集合(frozenset)创建很简单,关键在“一次性传入可迭代对象”,不能套用 set() 再转——那样多一层、易出错、还可能因顺序不确定引发误判。
怎么正确创建 frozenset
直接把原始数据交给 frozenset():
-
frozenset([1, 2, 2, 3])→frozenset({1, 2, 3})(列表去重后生成) -
frozenset("abc")→frozenset({'a', 'b', 'c'})(字符串拆成字符去重) -
frozenset({1: "x", 2: "y"}.keys())→frozenset({1, 2})(字典键本身可迭代) -
frozenset()→ 空不可变集合frozenset()
别写 frozenset(set([1,2,3]))——既冗余,又失去控制;frozenset 不是 set 的只读包装,它压根不支持 add、remove、clear 等任何修改方法。
为什么能当字典键或集合元素
因为 frozenset 满足哈希要求:有 __hash__ 方法,且内容不可变 → hash 值从创建起就固定不变。
-
{frozenset([1,2]): "config_a", frozenset(["dev"]): "env_dev"}✅ 合法 -
{ {1,2}: "fail" }❌ 报错:unhashable type: 'set'
注意:frozenset([1,2]) == {1,2} 是 False,类型不同,不能混着比;但 frozenset([1,2]) == frozenset([2,1]) 是 True,顺序不影响相等性。
常用操作和注意事项
frozenset 支持所有集合运算,但结果仍是新的 frozenset,不会修改原对象:
- 并集:
fs1 | fs2或fs1.union(fs2) - 交集:
fs1 & fs2或fs1.intersection(fs2) - 差集:
fs1 - fs2或fs1.difference(fs2) - 判断子集:
fs1
小集合推荐用 frozenset;大集合虽可用,但构造开销略高,频繁创建需留意性能。它天然线程安全,适合做配置标识、缓存键、嵌套集合的成员等场景。











