我可以提供一些简单的例子,说明何时使用冷冻装置将是帮助我更好地理解这个概念的最佳选择.
解决方法
frozenset()对象可用作字典键以及set()和frozenset()对象内的值,而set对象则不能. set()值是可变的而不是hashable,frozenset()值是不可变的并且是可清除的.
它们是为对象设置列表对象的元组.
演示:
>>> 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>",in <module> TypeError: unhashable type: 'set' >>> s.add(fs) # a frozenset as value in a set works
最近的Python版本将优化set文字的使用:
if somevar in {'foo','bar','baz'}:
通过使用字节码存储frozenset()常量:
>>> import dis >>> dis.dis(compile("if somevar in {'foo','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()不能以这种方式存储,因为这样可以改变与byte对象一起存储的常量.