在 Python 中,frozenset 是一个不可变的集合(Set)类型。
核心特点
- 不可变性(Immutable):一旦创建,就不能添加、删除或修改其中的元素。
- 哈希able(Hashable):因为它是不可变的,
frozenset本身可以作为字典的键或另一个集合的元素(而普通的set不行)。 - 无序性:元素没有固定的顺序。
- 唯一性:集合中的元素必须是唯一的,不允许重复。
基本用法
创建 frozenset
# 从列表创建
fs = frozenset([1, 2, 3, 4, 5])
print(fs) # 输出: frozenset({1, 2, 3, 4, 5})
# 从字符串创建
fs_str = frozenset("hello")
print(fs_str) # 输出: frozenset({'h', 'e', 'l', 'o'}) # 'l' 只出现一次
# 空 frozenset
empty_fs = frozenset()
print(empty_fs) # 输出: frozenset()
常用方法
frozenset 支持许多与 set 相同的只读操作,
issubset()/<=:是否是子集issuperset()/>=:是否是超集union()/ :并集intersection()/&:交集difference()/ :差集symmetric_difference()/^:对称差集copy():返回副本
a = frozenset([1, 2, 3])
b = frozenset([2, 3, 4])
# 交集
print(a & b) # frozenset({2, 3})
# 并集
print(a | b) # frozenset({1, 2, 3, 4})
# 差集
print(a - b) # frozenset({1})
# 判断子集
print(a.issubset([1, 2, 3, 5])) # True
❌ 不支持的操作
由于不可变,以下操作会抛出 AttributeError:
add()remove()discard()update()clear()
fs = frozenset([1, 2, 3]) fs.add(4) # ❌ AttributeError: 'frozenset' object has no attribute 'add'
为什么使用 frozenset?
✅ 主要用途:作为字典的键或集合的元素
普通 set 是可变的,因此不能作为字典的键或放入另一个集合中,而 frozenset 可以。
# 错误示例:普通 set 不能作为字典的键
# my_dict = {set([1, 2]): "value"} # ❌ TypeError: unhashable type: 'set'
# 正确示例:frozenset 可以作为字典的键
my_dict = {
frozenset([1, 2]): "value1",
frozenset([3, 4]): "value2"
}
print(my_dict[frozenset([1, 2])]) # 输出: value1
✅ 用于需要不可变集合的场景
- 缓存(memoization):当函数参数包含集合时,用
frozenset可以缓存结果。 - 确保数据不被意外修改。
set vs frozenset 对比
| 特性 | set |
frozenset |
|---|---|---|
| 可变性 | 可变(Mutable) | 不可变(Immutable) |
| 哈希性 | 不可哈希(Unhashable) | 可哈希(Hashable) |
| 能否作为字典键 | ❌ 否 | ✅ 是 |
| 能否放入其他集合 | ❌ 否 | ✅ 是 |
| 性能 | 增删改快 | 创建后只读,查询快 |
| 适用场景 | 动态集合操作 | 需要不可变集合、作为键 |
- 如果你需要一个可以修改的集合,使用
set。 - 如果你需要一个不可变的集合,或者需要将它用作字典的键或其他集合的元素,使用
frozenset。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/483656.html



