实习小记-python中不可哈希对象设置为可哈希对象

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下:

实习小记-python中可哈希对象是个啥?what is hashable object in python?

预备知识:

在定义一个类时,如果我们需要改写该类的__eq__函数,特别要注意的是它将会变为不可哈希对象,也就是说如果你将它放到哈希集会报错误

>>> class A:

... def __init__(self, x):

... self.x = x

... def __eq__(self, other):

... return self.x == other.x

...

>>> a = A(1)

>>> b = A(1)

>>> a == b

True

>>> dic = {a:1}

Traceback (most recent call last):

File "<ipython-input-6-8bf0323d7544>", line 1, in <module>

dic = {a:1}

TypeError: unhashable type: 'A'

可是如果我们定义的这个类既需要重写__eq__函数也需要把它设定为可哈希的对象这该怎么办呢?官方文档里面已经详细描述了,我们只需在类变量中加上__hash__ = object.__hash__即可。

>>> class A:

... __hash__ = object.__hash__

... def __init__(self, x):

... self.x = x

... def __eq__(self, other):

... return self.x == other.x

...

>>> a = A(1)

>>> b = A(1)

>>> a == b

True

>>> dic = {a:1}

>>>

那么问题来了,如果我们想用b为键值查找dic中对应的数据可以成功吗?

>>> dic[a]

1

>>> dic[b] #提示键值错误

Traceback (most recent call last):

File "<ipython-input-13-5e085ba4c448>", line 1, in <module>

dic[b]

KeyError: <__main__.A object at 0x103b77610>

>>> a.__hash__() #这里我们发现a和b的哈希值是不一样的

272332629

>>> b.__hash__()

272332641

>>> hash(a) == hash(b)

False

从上面的代码我们知道,在哈希集中对某个键值的查找是针对该键值的哈希值做比较的。即使我们重写了__eq__也不会影响到哈希集中对应键值的查找。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航