>>> s = set([1, 2])
>>> fs = frozenset(s)
>>> adict = {}
>>> adict[s] = 42 # a set as key does not work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> adict[fs] = 42 # a frozenset as key works
>>> s.add(s) # a set as value in a set does not work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> s.add(fs) # a frozenset as value in a set works
3条答案
按热度按时间stszievb1#
frozenset()
对象可用作字典键以及set()
和frozenset()
对象**内部的值,而set
对象不能。set()
值可变但不可散列,frozenset()
值不可变但可散列。它们对于
set
对象的意义就像tuple
对象对于list
对象的意义一样。演示:
最新的Python版本将优化集合常量的使用:
通过存储带有字节码的
frozenset()
常量:因为集合常量 * 无论如何 * 都不能改变;这使得使用集合来测试非常有效。2一个常规的
set()
不能以这种方式存储,因为这将允许你改变与byte对象一起存储的常量。yqkkidmi2#
为了赞美Martijn所说的,我经常使用它们作为缓存键,例如,一个可以关闭
(args, frozenset(kwargs.items())
的memoize装饰器。a8jjtwal3#
我应该补充一点,与元组(也可以用作dict键或集合成员,因为它是可散列的)不同,
frozenset
是无序的,这使得它在您不关心项目排序的情况下非常方便。here是一个详细的示例,请参见dbramucci的帖子。