实习小记

作者: 全球彩票app苹果版  发布:2020-01-03

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

在这里篇以前,作者又特别翻译过官方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__也不会影响到哈希聚焦对应键值的寻觅。

在此篇从前,笔者又特地翻译过合法python3.3的可哈希对象文档,我们能够先参考...

本文由全球彩票历史版本发布于全球彩票app苹果版,转载请注明出处:实习小记

关键词:

上一篇:上快速安装上手
下一篇:没有了