2014-03-12 63 views

回答

8

frozenset()對象可以用來作爲字典鍵和作爲值內部set()frozenset()對象,其中set對象不能。 set()值是可變的且不可哈希值,frozenset()值是不可變的且可哈希值。

它們是set對象什麼tuple對象是list對象。

演示:通過存儲frozenset()常數與字節碼

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

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

因爲

>>> 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版本將優化使用一組文字的無論如何,設置文字不能突變;這使得使用集合來測試非常有效。常規的set()不能以這種方式存儲,因爲這樣可以讓您修改與字節對象一起存儲的常量。

+0

我也開始在.compile()中蘸我的腳趾。這也進一步鞏固了我對這個功能的理解,個人感謝。 – Phoenix

2

爲了恭維Martijn說過的話,我經常使用它們作爲緩存鍵。例如,一個memoize修飾器可以關閉(args, frozenset(kwargs.items())

相關問題