2026-07-16 23:46:32
Python中的集合分为可变集合(set)和不可变集合(frozenset),二者的可变性总结如下:
可变集合(set)
可变性:元素可动态增删或修改。创建后可通过add()、remove()、discard()、pop()等方法修改内容。
创建方式:
使用set()函数:a = set([1, 2, 3]) 或 a = set()(空集合)。
使用花括号{}:a = {1, 2, 3}(注意a = {}创建的是空字典,非集合)。
元素要求:必须是可哈希(不可变)的数据类型,如数字、字符串、元组等。若包含可变类型(如列表)会报错。
特性:无序、不重复,支持集合运算(并集|、交集&、差集-等),运算结果类型与最左操作数一致。
示例:
a = {1, 2, 3}a.add(4) # 增加元素 → {1, 2, 3, 4}a.remove(2) # 删除元素 → {1, 3, 4}不可变集合(frozenset)
可变性:创建后不可修改(无增删方法),元素不可变。
创建方式:
使用frozenset()函数:a = frozenset([1, 2, 3]) 或 a = frozenset()(空不可变集合)。
元素要求:与set相同,必须是可哈希类型。若包含可变类型(如列表)会报错。
特性:无序、不重复,支持集合运算(结果类型与最左操作数一致),可用作字典的键(因不可变性满足哈希要求)。
示例:
a = frozenset([1, 2, 3])# a.add(4) # 报错:不可修改b = {1, 2}print(a & b) # 交集运算 → frozenset({1, 2})(若a为最左操作数则返回frozenset)关键区别
可变性:set可修改,frozenset不可修改。
用途:
set适用于需要动态增删元素的场景(如去重、成员检测)。
frozenset适用于需要不可变集合的场景(如字典键、函数参数传递避免意外修改)。
哈希性:frozenset本身可哈希,而set不可(因可变性导致哈希值不稳定)。
类型转换与运算规则
可通过set()或frozenset()转换其他可迭代对象(如列表、元组)为集合类型。
集合运算(如s & t)的结果类型由最左操作数决定:
若s为set,t为frozenset,则结果为set。
若s为frozenset,t为set,则结果为frozenset。
注意事项
空集合必须用set()创建,{}表示空字典。
集合元素自动去重,且无序存储,无法通过索引访问。
嵌套集合时,外层若为frozenset,内层元素也需为可哈希类型(如不可嵌套列表)。
总结:Python集合的可变性由类型决定,set支持动态修改,frozenset不可变但更安全,二者共同提供灵活的无序不重复数据结构,适用于不同场景需求。