【Python】set与frozenset的区别

本文深入探讨了Python中的集合类型,包括set与frozenset的区别,阐述了它们的特性和使用场景。重点强调了frozenset的冻结状态及其在构建不可变数据结构时的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同多数语言一样,set表示集合,最重要的特性就是无序,所以Python中的set不支持indexing,但支持len(set),x in set 等操作。

set有两种类型,set和frozenset。

set是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。

frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

举例如下

fza=frozenset('a')
adict={fza:1,'b':2} #正确
setb=set('a')
bdict={setb:1,'b':2} #错误

还有一点需要注意,不管是set还是frozenset,Python都不支持创建一个整数的集合。

seta=set(1) #错误
setb=set('1')#正确


### Python 中 `frozenset` 的用法 #### 创建不可变集合 `frozenset` 是一种内置类型的不可变版本,类似于常规的 `set` 类型。由于其不可变特性,在创建之后无法修改其中的内容。 ```python # 使用 frozenset() 函数来创建一个空的 frozenset 或者基于可迭代对象初始化它 empty_frozen_set = frozenset() print(empty_frozen_set) elements = ['apple', 'banana', 'cherry'] immutable_set = frozenset(elements) print(immutable_set) # 输出: frozenset({'banana', 'cherry', 'apple'})[^1] ``` #### 添加到其他数据结构作为键 因为 `frozenset` 不可变,所以可以被用来当作字典中的键或是另一个集合里的成员。 ```python dictionary_with_frozen_sets_as_keys = { frozenset(['a']): "value_a", frozenset(['b']): "value_b" } print(dictionary_with_frozen_sets_as_keys[frozenset(['a'])]) # 输出: value_a another_set_containing_frozen_sets = set([frozenset(['c']), frozenset(['d'])]) print(another_set_containing_frozen_sets) # 输出: {frozenset({'d'}), frozenset({'c'})} ``` #### 集合操作 尽管不能改变现有的 `frozenset` 实例,但是仍然能够执行各种标准的集合理论运算,比如交集、并集等,并返回新的 `frozenset` 对象表示结果。 ```python fs1 = frozenset([1, 2, 3]) fs2 = frozenset([2, 3, 4]) union_result = fs1.union(fs2) intersection_result = fs1.intersection(fs2) difference_result = fs1.difference(fs2) print(f"Union of sets is {union_result}") # Union of sets is frozenset({1, 2, 3, 4}) print(f"Intersection of sets is {intersection_result}") # Intersection of sets is frozenset({2, 3}) print(f"Difference between first and second set is {difference_result}") # Difference between first and second set is frozenset({1}) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值