<p>在Github上有一个很好的帖子:<a href="https://github.com/sympy/sympy/wiki/What-happens-when-you-mess-with-hashing">What happens when you mess with hashing</a>。
首先,您需要知道Python期望(引用本文):</p>
<ul>
<li><p>对象的哈希在对象的整个生命周期中不会改变(换句话说,哈希对象应该是不可变的)。</p></li>
<li><p><code>a == b</code>表示<code>hash(a) == hash(b)</code>(注意,在哈希冲突的情况下,反之可能不成立)。</p></li>
</ul>
<p>下面是一个代码示例,它展示了变量散列的问题,有一个稍有不同的类示例,但思想保持不变:</p>
<pre><code>>>> class Bad(object):
... def __init__(self, arg):
... self.arg = arg
... def __hash__(self):
... return hash(self.arg)
...
>>> Bad(1)
<__main__.Bad object at ...>
>>> hash(Bad(1))
1
>>> a = Bad(1)
>>> b = {a:1}
>>> a.arg = 2
>>> hash(a)
2
>>> b[a]
Traceback (most recent call last):
...
KeyError: <__main__.Bad object at ...>
</code></pre>
<blockquote>
<p>Here, we implicitly changed the hash of a by mutating the argument of a that is used to compute the hash. As a result, the object is no longer found in a dictionary, which uses the hash to find the object.</p>
<p>Note that Python doesn't prevent me from doing this. I could make it if I want, by making <code>__setattr__</code> raise <code>AttributeError</code>, but even then I could forcibly change it by modifying the object's <code>__dict__</code>. This is what is meant when we say that Python is a "consenting adults" language. </p>
</blockquote>
<p><strong>它不会使Python崩溃</strong>,但是dict/set和基于对象哈希的所有内容都将发生意外行为。在</p>