python中set是可变集合,支持add、update、remove等操作,适用于动态数据管理;frozenset是不可变集合,可哈希,能作字典键或集合元素,用于固定组合场景。

Python 中的 set 是可变集合,支持增删改查;而 frozenset 是不可变集合,创建后内容不能修改,但可以作为字典的键或集合的元素。
set 是可变的,适合动态数据管理
set 支持添加、移除、更新等操作,适用于需要频繁变更成员的场景:
-
add()添加单个元素 -
update()批量添加多个元素(接受可迭代对象) -
remove()或discard()删除指定元素 -
pop()随机移除并返回一个元素
例如去重并持续收集用户ID:
>>> user_ids = set()>>> user_ids.add(101)
>>> user_ids.update([102, 103])
>>> user_ids
{101, 102, 103}
frozenset 不可变,用于需要哈希值的场合
frozenset 创建后无法修改,因此具备哈希性(__hash__ 方法),能用作字典键或嵌套在其他集合中:
立即学习“Python免费学习笔记(深入)”;
- 当一组数据逻辑上是“固定组合”时,比如权限标签、配置项组合
- 做字典键:普通
set不行,frozenset可以 - 作为集合的元素:避免嵌套可变类型带来的不确定性
例如用 frozenset 表示角色权限,并映射到角色名:
>>> role_perms = {frozenset({'read', 'write'}): 'editor',
frozenset({'read'}): 'viewer'
}
>>> role_perms[frozenset({'read', 'write'})]
'editor'
两者转换与使用建议
frozenset 可由 set、列表、元组等构造;反之不可直接转回可变集合(需显式新建 set):
-
frozenset(my_set)或frozenset([1,2,3]) -
set(my_frozenset)得到新可变集合 - 若需“冻结”当前状态供后续只读使用,优先选
frozenset - 函数参数中接收一组不可变标签时,用
frozenset更安全,避免被意外修改
常见误用提醒
试图修改 frozenset 会立即报错:
>>> fs.add(3)
AttributeError: 'frozenset' object has no attribute 'add'
另外,虽然 frozenset 本身不可变,但它不递归保证内部元素不可变——不过由于它只接受不可变元素(如数字、字符串、元组),实际中不会出现嵌套可变对象的问题。










