<p>使用<code>frozenset</code>作为<code>dict</code>键是否安全?<strong>是的。</strong></p>
<p>根据文档,Frozenset是散列的,因为它是不可变的。这意味着它可以用作dict的密钥,因为密钥的先决条件是它是散列的。</p>
<p>从<a href="https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset" rel="nofollow noreferrer">FrozenSet docs</a></p>
<blockquote>
<p>The frozenset type is immutable and hashable — its contents cannot be altered after it is created; it can therefore be used as a dictionary key or as an element of another set.</p>
</blockquote>
<p>冗余地,从<a href="https://docs.python.org/2/tutorial/datastructures.html#dictionaries" rel="nofollow noreferrer">Dictionary docs</a>:</p>
<blockquote>
<p>...keys, which can be any immutable type</p>
</blockquote>
<hr/>
<p>为了澄清,一个集合(根据定义),无论是否冻结,都不能保持顺序。它们以不考虑顺序和删除重复元素的方式存储在内部,因此以不同顺序构建的两个集合将是字典中的等价键——它们是相同的。</p>
<pre><code>>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True
</code></pre>
<p>同样地</p>
<pre><code>>>> d = {}
>>> d[frozenset([1,1,2,3])] = 'hello'
>>> d[frozenset([1,2,3,3])]
'hello'
>>> d[frozenset([3,3,3,2,1,1,1])]
'hello'
>>> d[frozenset([2,1,3])]
'hello'
</code></pre>