<p>我在Python 2.6.6和numpy 1.3.0中得到了相同的结果。根据<a href="http://docs.python.org/glossary.html#term-hashable">the Python glossary</a>,如果定义了<code>__hash__</code>(而不是<code>None</code>),并且定义了<code>__eq__</code>或<code>__cmp__</code>,那么对象应该是散列的。<code>ndarray.__eq__</code>和<code>ndarray.__hash__</code>都被定义并返回有意义的内容,所以我不明白<code>hash</code>为什么会失败。在快速的google之后,我找到了<a href="http://osdir.com/ml/python.scientific.devel/2005-09/msg00035.html">this post on the python.scientific.devel mailing list</a>,它声明数组从来没有打算是散列的-所以为什么定义<code>ndarray.__hash__</code>,我不知道。注意<code>isinstance(nparray, collections.Hashable)</code>返回<code>True</code>。</p>
<p>编辑:注意<code>nparray.__hash__()</code>返回的结果与<code>id(nparray)</code>相同,因此这只是默认实现。也许在早期版本的python中删除<code>__hash__</code>的实现是困难的或不可能的(2.6中显然引入了<code>__hash__ = None</code>技术),所以他们使用某种C-API魔法来实现这一点,这种方法不会传播到子类,也不会阻止您显式调用<code>ndarray.__hash__</code>?</p>
<p>Python 3.2.2和当前的numpy 2.0.0与repo有所不同。<code>__cmp__</code>方法不再存在,因此哈希性现在需要<code>__hash__</code>和<code>__eq__</code>(请参见<a href="http://docs.python.org/py3k/glossary.html#term-hashable">Python 3 glossary</a>)。在这个版本的numpy中,<code>ndarray.__hash__</code>是被定义的,但是它只是<code>None</code>,所以不能被调用。<code>hash(nparray)</code>失败,<code>isinstance(nparray, collections.Hashable)</code>按预期返回<code>False</code>。<code>hash(vector)</code>也失败了。</p>