frozenset类型作为set标准类型的不可变版本在Python中出现。确保可以将集合用作其他set的元素和dict的键是很重要的,因此需要一个不可变的变体。
实际问题是需要唯一性和快速检查元素的可能性,以及将集合用作字典的键或另一个集合的元素。普通的set不合适,因为它是可变的,因此不可哈希。
frozenset是不可变(immutable)集合。创建后,它的元素不能更改:添加、删除或修改。但是frozenset支持所有与set相同的操作,除了可变的操作。
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # 允许,因为frozenset是可哈希的
frozenset可以包含可变对象(例如列表)吗?
不,只有可哈希/不可变的对象可以作为任何类型集合的元素。frozenset([[], 1])会引发TypeError,就像普通的set一样。
可以从frozenset得到可变set并反向转换吗?
这两种类型可以通过标准构造函数相互转换:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
frozenset支持add()或remove()方法吗?
不,这些方法不存在,任何尝试调用它们的行为都会导致AttributeError,因为frozenset是不可变的。
使用普通set作为dict中的键:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
优点:
缺点:
转换为frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
优点:
缺点: