能否提供一些简单的示例,说明何时使用Frozenset是最好的选择,以帮助我更好地理解该概念。

最佳答案

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

因为设置的文字无论如何不能被改变;这使得使用集合进行测试非常有效。常规set()不能以这种方式存储,因为那样会使您改变与字节对象一起存储的常量。

关于python - Frozenset()-何时使用它们的示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22359664/

10-09 17:23