<p>在Python中,dict的<code>keys</code>被存储为<code>hash-slot</code>对,其中{<cd3>}由某个{<cd5>}下的<code>key-value</code>对组成。因此,在dict中通过<code>key</code>获得{<cd6>}的实际搜索过程如下:</p>
<ol>
<li>获取提供的密钥<code>hash(key)</code>的哈希值</li>
<li>在<code>hash</code>值下找到对应的<code>slot</code></li>
<li>迭代<code>slot</code>以找到满足<code>tkey == key</code>的目标键(将其命名为<code>tkey</code>),然后返回该键的<code>value</code>。在</li>
</ol>
<p>因此,在Python中,<strong>相同的<code>keys</code>可能具有不同的值,如果它们的<code>keys</code>不相同,{<cd17>}可能具有不同的值。<code>hash</code>值由<code>__hash__</code>方法计算而<code>key</code>是否相同由<code>__eq__</code>方法(或<code>__cmp__</code>)控制。<br/>
例如</p>
<pre><code>class A:
def __hash__(self):
return 1
def __eq__(self, other):
return False
</code></pre>
<p>现在,<code>A</code>的所有实例都具有相同的散列值<code>1</code>,但所有实例都不同(包括与自身的比较):</p>
^{pr2}$
<p>让我们看看在<code>dict</code>中充当<code>keys</code>时它们可以是什么:</p>
<pre><code>b = {
a1: 1,
a2: 2,
}
print(b)
# {<__main__.A object at 0x000002DDCB505DD8>: 1,
# <__main__.A object at 0x000002DDCB505D30>: 2}
</code></pre>
<h2>为什么<code>True</code>和{<cd26>}不能同时存在于一个dict中</h2>
<p>在这个问题中(或者在Python中的大多数情况下),等价的<code>hash</code>表示等价的{<cd7>}。在</p>
<pre><code>print(hash(True) == hash(1)) # True
print(True == 1) # True
</code></pre>
<p>结果(或者说,这个等式机制的原因)是每个<code>hash slot</code>只有一个<code>key-value</code>对(因为<code>keys</code>是相等的)。这使得搜索值非常快,因为不需要在槽上迭代。你仍然可以在相同的代码中实现相同的键</p>
<pre><code>class exint(int):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return False
def __hash__(self):
return int.__hash__(self.val)
a = exint(1)
print(a) # 1
b = {
a: 1,
True: 2,
}
print(b) # {1: 1, True: 2}
</code></pre>