python的可哈希对象

一、介绍

在Python中,可哈希(hashable)是指一种对象类型,该类型的对象可以用作字典的键(keys)或集合(sets)的元素。可哈希的对象具有以下特点:

  1. 不可变性(Immutable): 可哈希的对象必须是不可变的,即创建后不能被修改。这确保了哈希值的稳定性,因为哈希值是根据对象的内容计算得出的。

  2. 具有哈希函数: 可哈希对象需要具有一个哈希函数(hash function),这个函数将对象映射到一个唯一的整数,即哈希值。这个哈希值用于在字典或集合中快速查找或比较对象。

二、 可哈希对象与不可哈希的对象

不可哈希的对象包括列表、集合和字典等可变对象,因为它们可以在创建后修改。而字符串、元组等不可变对象是可哈希的。

以下是一些常见的可哈希对象类型:

  • 整数(int)
  • 浮点数(float)
  • 字符串(str)
  • 元组(tuple)
  • 冻结集合(frozenset)

例如,以下是一些可哈希的对象:

# 整数、浮点数、布尔值都是不可变类型的对象,因此都是可哈希的
42
3.14
True# 字符串和元组都是不可变类型的对象,因此都是可哈希的
"hello"
(1, 2, 3)# frozenset是不可变类型的集合,因此是可哈希的
frozenset([1, 2, 3])

而以下对象则不是可哈希的:

# 列表是可变类型的对象,因此不是可哈希的
[1, 2, 3]# 集合也是可变类型的对象,因此不是可哈希的
set([1, 2, 3])# 字典是可变类型的对象,因此不是可哈希的
{"name": "Alice", "age": 30}

需要注意的是,自定义的类实例默认是可哈希的,但这取决于类的实现。如果类没有正确实现 __hash__() 方法和 __eq__() 方法,那么实例可能不会按预期工作。为了确保自定义类的实例是可哈希的,你需要实现这些方法。 

三、__hash__()__eq__()

__hash__()方法是一个对象的特殊方法,用于返回该对象的哈希值。哈希值是一个整数,用于表示对象的唯一标识。相等的对象必须具有相同的哈希值。如果一个对象没有实现__hash__()方法,那么它就不能被用作字典的键或集合的成员。

__eq__()方法是一个对象的特殊方法,用于比较两个对象是否相等。如果一个对象没有实现__eq__()方法,那么它就不能被用作集合的成员,因为集合需要比较成员对象的相等性。

示例

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __hash__(self):return hash((self.name, self.age))def __eq__(self, other):return (self.name, self.age) == (other.name, other.age)p1 = Person("Alice", 30)
p2 = Person("Alice", 30)print(p1 == p2)  # 输出 True
print(hash(p1))  
print(hash(p2)) 

 

在该示例中,Person类实现了__hash__()方法和__eq__()方法,用于比较两个Person对象的相等性。__hash__()方法返回一个包含姓名和年龄的元组的哈希值,而__eq__()方法比较两个对象的姓名和年龄是否相等。因此,两个姓名和年龄相同的对象具有相同的哈希值。

参考:

【Python面向对象编程】第13篇 特殊方法之__hash___不剪发的Tony老师的博客-CSDN博客

Python:__eq_和__str__函数的用法___eq___Python 学习者的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/112677.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】SLT——Vector详解

本片要分享的是关于STL中Vector的内容,Vector的内容于string非常相似,只要会使用string那么学习Vector时会非常流畅。 目录 1.vector介绍 2.vector的简单实用 2.1.简单的无参构造 ​编辑2.2.简单带参构造 2.3.迭代器区间初始化 2.4.vector的遍历 …

爬虫逆向实战(二十六)--某某学堂登录

一、数据接口分析 主页地址:某某学堂 1、抓包 通过抓包可以发现数据接口是Account/LoginPost 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现pass是加密参数 请求头是否加密? 无响应是否加密? 无co…

想要搞懂接口测试和功能测试有什么区别,那就必须知道他们的基本原理

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xf…

VBA技术资料MF48:VBA_在Excel中将列号与字母转换

【分享成果,随喜正能量】除非自己的认知获得了改变和刷新,否则,人们常说的“顺应自己的内心”,顺的不过是一颗旧心,一颗惯性的,充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反,人要用…

java+ssm+mysql农场信息管理系统

项目介绍: 本系统为基于jspssmmysql的农场信息管理系统,功能如下: 用户:注册登录系统,菜地信息管理,农作物信息管理,种植信息管理,客户信息管理,商家信息管理&#xff…

java项目mysql转postgresql

特殊函数 : mysql: find_in_set(?, ancestors) postgresql: ? ANY (string_to_array(ancestors,,)) mysql: date_format(t1.oper_time, %Y-%m-%d) postgresql: rksj::date to_char(inDate,YYYY-MM-DD) mysql&am…

十六、pikachu之SSRF

文章目录 1、SSRF概述2、SSRF(URL)3、SSRF(file_get_content) 1、SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…

go:正确引入自己编写的包(如何在 Go 中正确引入自己编写的包)

前言 目录如下: 具体教程 1. 工作空间(我的是根目录)新建 go.work 文件 文件内容如下: go 1.21.0use (./tuchuang./tuchuang/testm ) 2. 添加go.mod文件 1. 包文件夹下 进入testm目录执行 go mod init testModule 2. 引用目…

文本匹配实战系列

引言 本系列文章开始介绍深度学习在文本匹配领域的应用,并且会尝试得到各种模型在给定的数据集上的表现。 深度文本匹配发展比较久,积累了很多文本匹配方法。也有很多的分类方式,一种分类方式是表示型和交互型。 表示型方法 表示型(repre…

R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列...

全文下载链接:http://tecdat.cn/?p25880 本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多…

易混淆的符号

C自学精简教程 目录(必读) &符号在C中有多个含义。 下面我们列出常见的3种&#xff0c;你都能分得清吗&#xff1f; #include <iostream> using namespace std;//传递引用类型的参数 pass by reference void fun(int& a)//(1) 这里的 & 表示参数a是引用类…

成集云 | 抖店客户静默下单催付数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着各品牌全渠道铺货&#xff0c;主播在平台上直播时客户下了订单后不能及时付款&#xff0c;第一时间客户收不到提醒&#xff0c;不仅造成了客户付款率下降&#xff0c;更大量消耗了企业的人力成本和经济。而成集云与钉钉深度合作&#xff0…

Vue.js安装步骤和注意事项

安装完node.js后开始安装和部署Vue在检查webpack的下载版本时出现错误出现错误的原因是之前下载时未指定对应的版本号导致版本不兼容先卸载掉之前下载的版本 cnpm uninstall webpack-cli -g cnpm install webpack-cli4.9.2 -g 最后检查版本是否对应

CentOS8安装mysql8.0.24

一、下载mysql安装包并解压 执行以下命令&#xff1a; # 创建mysql安装目录 mkdir /usr/local/mysql # 进入mysql安装目录 cd /usr/local/mysql/ # 下载mysql-8.0.24 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz # 解压…

Linux 虚拟机安装 hadoop

目录 1 hadoop下载 2 解压hadoop 3 为 hadoop 文件夹改名 4 给 hadoop 文件夹赋权 5 修改环境变量 6 刷新环境变量 7 在hadoop313目录下创建文件夹data 8 检查文件 9 编辑 ./core-site.xml文件 10 编辑./hadoop-env.sh文件 11 编辑./hdfs-site.xml文件 12 编辑./mapr…

【网络】HTTPS的加密

目录 第一组&#xff0c;非对称加密第二组&#xff0c;非对称加密第三组&#xff0c;对称加密证书签名 HTTPS使用的是非对称加密加对称加密的方案 &#xff08;非对称加密&#xff1a;公钥加/解密&#xff0c;私钥解/加密&#xff09; &#xff08;对称加密&#xff1a;一组对称…

文件属性查看和修改学习

这个是链接&#xff0c;相当于快捷方式&#xff0c;指向usr/bin这个目录&#xff0c;链接到这个目录

【自学开发之旅】基于Flask的web开发(一)

web开发项目设计&#xff1a; 立项-需求分析-设计&#xff08;原型图、数据库、api设计&#xff09;-技术选型-写代码-测试-上线 web开发的本质上就是生成超文本。 前端负责展示&#xff0c;后端负责逻辑处理&#xff1a;后逻辑请求&#xff08;接收请求、响应请求&#xff0…

Python文本终端GUI框架详解

今天笔者带大家&#xff0c;梳理几个常见的基于文本终端的 UI 框架&#xff0c;一睹为快&#xff01; Curses 首先出场的是 Curses。 Curses 是一个能提供基于文本终端窗口功能的动态库&#xff0c;它可以: 使用整个屏幕 创建和管理一个窗口 使用 8 种不同的彩色 为程序提供…

用最少数量的箭引爆气球【贪心算法】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…