Python中的可哈希与不可哈希对象详解
文章目录
- 1. 前置知识:哈希是什么
- 2. 可哈希和不可哈希对象的定义
- 2.1可哈希
- 2.2 不可哈希
- 3. 对象的哈希方法
- 3.1 自定义对象的哈希方法
- 3.2 可哈希性与等价性
- 3.3 哈希值的用途
- 推荐
在复习可变对象和不可变对象时,学到了这个内容
1. 前置知识:哈希是什么
哈希(Hashing)是一种将任意大小的数据转换成固定大小的数据的过程。这种转换通过哈希函数实现,它接收输入(或“消息”),并返回一个通常具有固定长度的字符串,这个字符串被称为哈希值或哈希码。哈希的主要用途包括数据的快速查找、数据完整性校验、以及安全应用中的加密技术。
哈希的关键特点是:
- 效率高:哈希函数设计为能够快速处理大量数据。
- 确定性:对于同一输入总是产生相同的输出。
- 随机分布:哈希值应均匀且随机分布,减少冲突。
- 不可逆性:理想的哈希函数使得从哈希值恢复原始输入极其困难。
2. 可哈希和不可哈希对象的定义
2.1可哈希
可哈希对象是指其生命周期内具有不变的哈希值的对象。这些对象可以作为字典的键或者集合的元素。整数、浮点数、字符串和元组都是可哈希的。
整数的哈希值
x = 10
print(hash(x)) # 输出:10的哈希值
用内置的hash()函数来获取一个整数的哈希值。
2.2 不可哈希
不可哈希对象是指内容可以更改的对象,因此哈希值也可能会变。列表和字典是典型的不可哈希对象。
列表的不可哈希性
my_list = [1, 2, 3]
try:print(hash(my_list))
except TypeError as e:print(e) # 输出错误信息,指出列表是不可哈希的
由于列表是可变的,Python不允许对其进行哈希。所以尝试哈希列表将抛出一个TypeError。
3. 对象的哈希方法
3.1 自定义对象的哈希方法
可哈希对象需要实现__hash__()
方法,该方法返回对象的哈希值。如果对象是可变的,则应返回None,表示对象不可哈希。
class Person:def __init__(self, name):self.name = namedef __hash__(self):return hash(self.name) # 基于名字的哈希值person = Person('Alice')
print(hash(person)) # 输出:Alice的哈希值
定义了一个Person类,重写__hash__()
方法使其实例可哈希。哈希函数基于人的名字来计算哈希值,根据对象的某个不变属性来提供一个一致的哈希值。
3.2 可哈希性与等价性
如果两个对象的哈希值相同,它们首先被视为可能相等,然后通过__eq__()
方法进行进一步的比较来确定是否真的相等。
实现等价性
class Product:def __init__(self, id, name):self.id = idself.name = namedef __hash__(self):return hash(self.id)def __eq__(self, other):return self.id == other.idproduct1 = Product(1, 'Apple')
product2 = Product(1, 'Apple')
print(hash(product1) == hash(product2)) # 输出:True
print(product1 == product2) # 输出:True
Product类通过id属性来定义其哈希方法和等价性检测。只要两个产品的id相同,就被认为是相等的,这说明了在自定义类中如何同时实现__hash__()和__eq__()方法来保证对象可以被正确地用于字典键或集合元素。
3.3 哈希值的用途
哈希值用于快速比较对象是否相同,是字典和集合高效性的关键。
字典中使用哈希值
my_dict = {person: 'Engineer'}
print(my_dict[person]) # 输出:'Engineer'
只有可哈希对象才可以作为字典的键
推荐
推荐我的相关专栏:
- python 错误记录
- python 笔记
相关文章:
Python中的可哈希与不可哈希对象详解
文章目录 1. 前置知识:哈希是什么2. 可哈希和不可哈希对象的定义2.1可哈希2.2 不可哈希 3. 对象的哈希方法3.1 自定义对象的哈希方法3.2 可哈希性与等价性3.3 哈希值的用途 推荐 在复习可变对象和不可变对象时,学到了这个内容 1. 前置知识:哈…...
【嵌入式DIY实例】-DIY速度计
DIY速度计 文章目录 DIY速度计1、硬件准备1.1 NEO-6M GPS模块介绍1.2 硬件接线原理图2、代码实现本文将介绍如何使用模拟仪表和 GPS 模块制作 DIY Arduino 速度计。 仪表用于显示当前速度,而GPS模块用于实时跟踪速度。 该项目将 Arduino 板与 GPS 模块相结合,在经典模拟仪表上…...

1.0 Hadoop 教程
1.0 Hadoop 教程 分类 Hadoop 教程 Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。 Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集…...

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)
效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角...

智能水务系统:构建高效节水的城市水网
随着城市化进程的加速和人民生活水平的提高,对水务管理的需求也越来越高。传统的水务管理方式已经无法满足现代社会的需求,而智能水务系统的出现为水务管理带来了新的变革。本文将从项目背景、需求分析、建设目标、建设内容、技术方案、安全设计等方面&a…...

【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现
目录 🚩UDP和TCP之间的区别 🎈TCP是有连接的 UDP是无连接的 🎈TCP是可靠传输 UDP是不可靠传输 🎈TCP是面向字节流 UDP是面向数据报 🎈TCP和UDP是全双工 👩🏻💻UDP的socket ap…...
数据结构复习指导之绪论(算法的概念以及效率的度量)
文章目录 绪论: 2.算法和算法评价 知识总览 2.1算法的基本概念 知识点回顾与重要考点 2.2算法效率的度量 知识总览 1.时间复杂度 2.空间复杂度 知识点回顾与重要考点 归纳总结 绪论: 2.算法和算法评价 知识总览 2.1算法的基本概念 算法( Al…...
C语言经典例题(23)
1.求n的阶乘。(不考虑溢出) #include <stdio.h>int fac(int n);int main() {int n 0;scanf("%d", &n);int sum fac(n);printf("%d", sum);return 0; }int fac(int n) {if (n > 1){return n * fac(n - 1);}elsereturn 1; }2.求第n个斐波那契…...
Gitea的简单介绍
Gitea 是一个自由、开源、轻量级的 Git 服务程序。它是为了建立一个易于使用的、类似 GitHub 的 Git 服务而创建的。Gitea 采用 Go 语言编写,具有简单、快速、易于安装和配置的特点。 Gitea 提供了一个基本的 Web 界面,可以方便地进行代码托管、问题跟踪、协作等操作。用户可…...

Qt信号与槽
我们在使用Qt的时候,不使用Qt Designer 的方式进行开发,使用ui文件,信号与槽的连接方式是生成代码之后才能在setupUi函数里才能看到,或者需要进入Ui设计器里的信号槽模式里才能看到信号槽的连接。所以我们最好使用代码绘制界面。 …...

QQ农场-phpYeFarm添加数据教程
前置知识 plugin\qqfarm\core\data D:\study-project\testweb\upload\source\plugin\qqfarm\core\data 也就是plugin\qqfarm\core\data是一个缓存文件,如果更新农场数据后,必须要删除才可以 解决种子限制(必须要做才可以添加成功) 你不更改加入了id大于2000直接删除种子 D…...

Java中创建多线程的方法
继承Thread类,对该类进行new一个实例,对实例调用start方法,重写run方法。 缺点:单继承,无法继承 public class myThread extends Thread {public static void main(String[] args) {myThread myThread new myThread()…...

MT3020 任务分配
思路:利用二分找到某个时间是满足“k个人可以完成” ,并且时间最小。 因为尽量让后面的人做任务,所以从后往前排任务(倒着分配)。从后往前遍历任务,如果此人加上这个任务超出之前求得的时间,就…...
【Redis】事务
Redis事务是一组命令的集合。这组命令顺序化执行而不会被其他命令插入。 Redis事务命令 命令描述DISCARD取消事务,放弃执行EXEC执行事务MULTI标记事务的开始UNWATCH取消WATCH对所有key的监控WATCH监控所有key Redis事务特点 特点说明单独的隔离操作Redis命令执行…...

每日一题(leetcode238):除自身以外数组的乘积--前缀和
不进阶是创建两个数组: class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int nnums.size();vector<int> left(n);vector<int> right(n);int mul1;for(int i0;i<n;i){mul*nums[i];left[i]mul;}mul1;for…...

内网通如何去除广告,内网通免广告生成器
公司使用内网通内部传输确实方便!但是会有广告弹窗推送!这个很烦恼!那么如何去除广告呢! 下载: 链接:https://pan.baidu.com/s/1CVVdWexliF3tBaFgN1W9aw?pwdhk7m 提取码:hk7m ID:…...

视频知识整理
1 视频播放器原理 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤: 解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据 解封装:将封装格式的数据,分离成为音频流压缩编码数据和视…...

【2024】使用Rancher管理k8s集群和创建k8s集群
Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…...
生成对抗网络 – Generative Adversarial Networks | GAN
目录 生成对抗网络 GAN 的基本原理 非大白话版本 第一阶段:固定「判别器D」,训练「生成器G」...

基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)
摘要 本文基于Python技术,搭建了YOLOv5s深度学习模型,并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下: (1)调研了移动端垃圾分类应用软件动态,并分析其优劣势;分析了深…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...