我刚开始使用 numpy
和它的 matrix
模块(非常非常有用!),我想要将一个矩阵对象作为字典的键,所以我查看了一下 matrix
是否实现了 __hash__
方法:
>>> from numpy import matrix
>>> hasattr(matrix, '__hash__')
True
它确实可以!很好,这意味着它可以成为字典的键:
>>> m1 = matrix('1 2 3; 4 5 6; 7 8 9')
>>> m1
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> m2 = matrix('1 0 0; 0 1 0; 0 0 1')
>>> m2
matrix([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> matrix_dict = {m1: 'first', m2: 'second'}
做得好!现在,让我们继续测试:
>>> matrix_dict[m1]
'first'
>>> matrix_dict[matrix('1 2 3; 4 5 6; 7 8 9')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
什么?所以说,它适用于相同的矩阵,但对于具有完全相同内容的另一个矩阵却不起作用?让我们看看__hash__
返回的是什么:
>>> hash(m1)
2777620
>>> same_as_m = matrix('1 2 3; 4 5 6; 7 8 9')
>>> hash(same_as_m)
-9223372036851998151
>>> hash(matrix('1 2 3; 4 5 6; 7 8 9')) # same as m too
2777665
因此,来自numpy
的matrix
的__hash__
方法会为相同的matrix
返回不同的值。
这样没关系吗?那么,这意味着它不能用作字典键吗?如果不能使用,为什么还要实现__hash__
?
numpy
遗漏了这一点。 - millimoose