在这篇之前,我又专门翻译过官方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__也不会影响到哈希集中对应键值的查找。

实习小记-python中不可哈希对象设置为可哈希对象的更多相关文章

  1. Python中print字体颜色的设置

    Python中print字体颜色的设置 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\033来完成 ...

  2. python中matplotlib所绘制的图包含了很多的对象

    上图中的top=‘off’意思是说顶部的grid lines 看不见. 去除frame,意思就是将这个矩形给去除掉,spine意思是脊柱 bars = plt.bar(pos, popularity, ...

  3. Python 中Editplus 特别实用的设置方法

    editplus 中输入tab自动变成4个空格打开tools->preference打开面板,files的子栏目->settings & syntax面板中的 tab/indent ...

  4. Python中输出字体的颜色设置

    1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程 开头部分: \033[显示方式;前 ...

  5. python中的一等对象--函数

    一等对象 什么是一等对象: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 python中的字符串,列表什么的都是一等对象,但对如果之前只是使用c++.jav ...

  6. python 中变量和对象

    1. 在 python 中,类型属于对象,变量是没有类型的:a=[1,2,3] a="Runoob"以上代码中,[1,2,3] 是 List 类型,"Runoob&quo ...

  7. python中一切皆对象的理解

    一切皆对象? 学过Java都知道,Java中有8个基本类型,其余的都是继承自Object类的引用类型.方法内的基本类型变量会在栈上分配,而引用类型会通过逃逸分析来决定在栈上分配或堆上分配.Java中关 ...

  8. Python中字典和集合

    Python中字典和集合 映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元 ...

  9. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

随机推荐

  1. Javaweb上下文监听者ServletContextListener

    一个监听类,不是一个servlet或JSP,它能监听ServletContext一生中的两个关键事件:初始化(创建)和撤销.这个类实现了javax.servlet.ServletContextList ...

  2. [下载] MultiBeast 6.2.1版,支持10.9 Mavericks。Mac上的驱动精灵,最简单安装驱动的方式。

    下载地址1:http://pan.baidu.com/s/1i3ier9F 下载地址2:http://www.tonymacx86.com/downloads.php?do=cat&id=3 ...

  3. IIS在默认情况并不支持对PUT和DELETE请求的支持

    IIS在默认情况并不支持对PUT和DELETE请求的支持: IIS拒绝PUT和DELETE请求是由默认注册的一个名为:“WebDAVModule”的自定义HttpModule导致的.WebDAV的全称 ...

  4. postgresql 9.6 rc1发布

    postgresql 9.6 rc1发布了,意味着postgresql 9.6正式版将会越来越近了. 对于dss来说,postgresql远优于mysql,尤其是9.6新引入的并行执行,将大大提高性能 ...

  5. windows下启动mongodb

    http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/#mongodb-as-a-windows-service C:\ ...

  6. 0728关于html的几个基础知识点

    1.文本的格式化. 文本的格式包括粗体,斜体等.<b></b>定义粗体,<i>定义斜体</i>,<del></del> 定义删除 ...

  7. C# DevExpress 的gridControl或gridView数据导出失败解决方法

    来自:http://blog.csdn.net/lybwwp/article/details/8049464 谢谢 在使用DevExpress 的GridPanel控件的时候出现了一个莫名其妙的现象, ...

  8. 树莓派上安装2.8寸TFT触摸屏

    在某宝的这里买了一个2.8寸的TFT触摸屏,其实就是中国版的ADAFRUIT 结合店家的帮助文档做了一下,一次点亮,这里也记录一下自己的安装过程(话说会硬件是会比会软件有不同的乐趣~~~) 由于店家推 ...

  9. R语言学习笔记:分析学生的考试成绩

    孩子上初中时拿到过全年级一次考试所有科目的考试成绩表,正好可以用于R语言的统计分析学习.为了不泄漏孩子的姓名,就用学号代替了,感兴趣可以下载测试数据进行练习. num class chn math e ...

  10. svn 服务器不能看log问题

    Subversion “show log” is offline 1.将/srv/svn/repos/ path svnserve.conf 里的 none-access = read 修改为none ...