python-3.x frozenset()-何时可以使用它们的示例

dwthyt8l  于 2023-01-14  发布在  Python
关注(0)|答案(3)|浏览(160)

我可以提供一些简单的例子,当使用冻结集将是最好的选择,以帮助我理解的概念更多,请。

stszievb

stszievb1#

frozenset()对象可用作字典键以及set()frozenset()对象**内部的值,而set对象不能。set()值可变但不可散列,frozenset()值不可变但可散列。
它们对于set对象的意义就像tuple对象对于list对象的意义一样。
演示:

>>> 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

最新的Python版本将优化集合常量的使用:

if somevar in {'foo', 'bar', 'baz'}:

通过存储带有字节码的frozenset()常量:

>>> import dis
>>> dis.dis(compile("if somevar in {'foo', 'bar', 'baz'}: pass", '<stdin>', 'exec'))
  1           0 LOAD_NAME                0 (somevar) 
              3 LOAD_CONST               4 (frozenset({'foo', 'baz', 'bar'})) 
              6 COMPARE_OP               6 (in) 
              9 POP_JUMP_IF_FALSE       15 
             12 JUMP_FORWARD             0 (to 15) 
        >>   15 LOAD_CONST               3 (None) 
             18 RETURN_VALUE

因为集合常量 * 无论如何 * 都不能改变;这使得使用集合来测试非常有效。2一个常规的set()不能以这种方式存储,因为这将允许你改变与byte对象一起存储的常量。

yqkkidmi

yqkkidmi2#

为了赞美Martijn所说的,我经常使用它们作为缓存键,例如,一个可以关闭(args, frozenset(kwargs.items())的memoize装饰器。

a8jjtwal

a8jjtwal3#

我应该补充一点,与元组(也可以用作dict键或集合成员,因为它是可散列的)不同,frozenset无序的,这使得它在您不关心项目排序的情况下非常方便。
here是一个详细的示例,请参见dbramucci的帖子。

相关问题