Python中存在既可变又可哈希的对象吗?答案居然是...

文章正文
发布时间:2024-07-15 17:33

Python中存在既可变又可哈希的对象吗?答案居然是...

2022-08-20 15:47

发布于:山西省

开学第一课:一定不要这样问老师Python问题

在线开放课程“Python程序设计基础”第7次开课通知

智慧树大学共享课“Python数据分析与数据可视化”2022年秋季继续开课

董付国老师Python系列教材推荐与选用参考

=============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材:

《Python程序设计(第3版)》, (ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月出版,2022年7月第13次印刷, 山东省一流本科课程“Python应用开发”配套教材清华大学出版社2020、2021年度畅销图书(本书第二版为2019、2020年度畅销图书)

天猫、当当、京东均有销售,可以选择自己常用平台搜索“董付国 第3版”找到本书。

配套资源:教学大纲(基于工程教育专业认证,含课程思政)、电子教案、微课视频、PPT课件、例题源码、习题答案、在线练习系统。

适用专业:计算机、网络工程、软件工程以及相关专业。

适用学时:>=64

页数:381

定价:59.8

微课视频:124个,共24小时20分钟

教学大纲:《Python程序设计(第3版)》配套 教学大纲

习题答案:《Python程序设计(第3版)》课后 习题答案

====================

上面是Python官方文档中对可哈希对象的描述。

在Python中,可哈希对象(hashable)是指可以计算哈希值且可与其他对象比较是否相等的对象,从面向对象程序设计的角度来讲,就是同时实现了特殊方法__hash__和__eq__的对象。对于Python内置对象来说,可哈希对象与不可变对象(immutable)表示的是一个意思。

Python内置函数hash用来计算对象的哈希值,一般来说并不需要关心一个对象的哈希值具体是多少,更多的是关心能不能计算它的哈希值。如果对象不可哈希,那么作为参数传递给hash函数时会报错引发异常并提示对象不可哈希。在Python内置对象中,整数、实数、复数、元组、字符串、内置函数、内置类都属于可哈希对象列表、字典、集合等类型的对象是不可哈希的。例如,

在内置的可哈希对象中,整数、字符串和字节串又有点特殊。整数的哈希值是它本身,而字符串和字节串在计算哈希值时会加入随机盐值,并且在不同的进程中使用的盐值不一样,在同一个进程中一直使用同一个盐值。例如,

自定义类和自定义类的对象默认是可哈希的,但每次计算的哈希值是不可控的,与其id有关系但又不同于id函数的返回值。例如,

如果想自己计算自定义对象的哈希值,可以在设计类的时候实现特殊方法__hash__,且该方法必须返回一个整数。例如,

自定义类以及自定义类的对象默认是可变的(mutable),所有的自定义类以及自定义类的对象可以随时增删成员。例如,

那么,问题来了,如果一个对象是可变的,它还有可能是可哈希的吗?答案是确定的,可变对象也可以是可哈希的

另一个问题,不可变对象一定是可哈希的吗?答案是不一定。例如,元组是不可变的,定义之后其中的元素数量以及元素的引用都不能改变。如果元组中的所有元素都是可哈希的,那么元组也是可哈希的。但如果元组中包含列表、字典、集合这样的不可哈希对象,那么元组也不是可哈希的,但它仍然是不可变的。例如,

最后,如果想实现不可哈希的自定义类,可以把特殊方法__hash__设置为None即可。例如,

根据Python官方文档中对Hashable的描述可知,如果在自定义类把特殊方法__eq__设置为空值None,该类的对象也是不可哈希的。例如,

温馨提示:

,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过150次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”或“培训”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过600节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习2256道客观题和546道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。返回搜狐,查看更多

责任编辑: