擅长:python、mysql、java
<p>从您的<code>__hash__</code>方法判断,该类存储对其参数的引用,并将其用作哈希。问题是,这些参数与构造对象的代码共享。如果他们改变了参数,散列也会改变,你将无法在它所在的任何字典中找到这个对象。在</p>
<p>论点不必复杂,只要一个简单的列表就可以了。在</p>
<pre><code>In [13]: class Spam(object) :
....: def __init__(self, arg) :
....: self.arg = arg
....: def __hash__(self) :
....: return hash(tuple(self.arg,))
In [18]: l = range(5)
In [19]: spam = Spam(l)
In [20]: hash(spam)
Out[20]: -3958796579502723947
</code></pre>
<p>如果我更改作为参数传递的列表,哈希值将更改。在</p>
^{pr2}$
<p>因为字典键是按散列组织的,所以当我使用<code>x in d</code>时,Python做的第一件事就是计算x的散列值,并在字典中查找具有该散列值的内容。问题是,当一个对象的哈希值在放入字典后发生变化时,Python会查看新的哈希值,而不会在那里看到所需的键。使用键列表,强制Python通过相等方式检查每个键,从而绕过哈希检查。在</p>