讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 对象可哈希性的实现条件

落静吖_5613

落静吖_5613

发布时间:2026-02-17 15:03:31

|

790人浏览过

|

来源于php中文网

原创

TypeError: unhashable type错误本质是对象__hash__返回None或未实现,且自定义了__eq__;内置不可变类型有哈希,可变容器刻意禁用;自定义类可哈希须同时满足:__hash__返回int、__eq__与__hash__基于相同不可变属性计算。

python 对象可哈希性的实现条件

对象为什么报 TypeError: unhashable type

Python 报这个错,本质是对象的 __hash__ 方法返回了 None,或压根没实现,同时 __eq__ 又被自定义过。内置不可变类型(如 str、int、tuple)默认有稳定哈希值;而可变容器(如 list、dict、set)直接禁用哈希——不是忘了写,是刻意设计。

常见踩坑场景:

  • 把自定义类实例塞进 set 或当 dict 的 key,但没实现 __hash__
  • 实现了 __eq__ 却没配对实现 __hash__,导致 Python 自动把 __hash__ 设为 None
  • 在 __hash__ 里引用了可变属性(比如某个 list 字段),后续修改该属性后哈希值突变,破坏字典/集合内部结构

让自定义类可哈希:必须同时满足三个条件

缺一不可。只写 __hash__ 不够,只写 __eq__ 更糟。

  • __hash__ 方法必须返回一个整数(int),不能返回 float、str 或其他类型
  • __eq__ 和 __hash__ 必须基于同一组属性计算——如果两个实例 __eq__ 返回 True,它们的 __hash__ 值必须完全相等
  • 参与哈希计算的所有属性,在对象生命周期内必须保持不变(即类应设计为“逻辑不可变”);否则哈希表查找会失效

示例:

立即学习“Python免费学习笔记(深入)”;

class Point:
    def __init__(self, x, y):
        self._x = x  # 用下划线暗示只读
        self._y = y
<pre class="brush:php;toolbar:false;">@property
def x(self):
    return self._x

@property
def y(self):
    return self._y

def __eq__(self, other):
    if not isinstance(other, Point):
        return False
    return self.x == other.x and self.y == other.y

def __hash__(self):
    return hash((self.x, self.y))  # 元组可哈希,且内容不可变

Li Python Sec Check
Li Python Sec Check

Python 安全规范检查工具:基于 CloudBase 规范、腾讯安全指南,LLM 智能分析(默认禁用,优先本地执行)

下载

__hash__ 返回 None 的两种典型情况

这不是 bug,是 Python 的显式约束机制。

  • 当你重写了 __eq__ 但没定义 __hash__,Python 会自动把 __hash__ 设为 None——哪怕父类原本有哈希能力(比如继承自 object)
  • 显式在 __hash__ 中写 return None,效果一样:实例变成不可哈希对象

验证方式很简单:

print(Point(1, 2).__hash__())  # 输出一个整数  
print(list().__hash__())       # 报 AttributeError  
print({}.__hash__())           # 同样报 AttributeError  

注意:AttributeError 和 TypeError: unhashable type 是不同错误层级——前者是没这个方法,后者是方法存在但返回了 None。

性能与兼容性:哈希值稳定性比“快”更重要

很多人想优化 __hash__ 计算速度,但真正关键的是稳定性:只要对象逻辑上“相等”,哈希值就必须恒定,且不能依赖外部状态(如时间、全局计数器、随机数)。

  • 避免在 __hash__ 中调用 len()、sum() 等可能因副作用改变结果的操作
  • 不要用 id() 当哈希值——它随对象内存地址变化,且不同运行周期不一致,无法用于持久化或跨进程场景
  • 如果对象字段含嵌套可变结构(如 list 字段),要么拒绝哈希,要么转成 tuple 再哈希(前提是确认该 list 真的不会再变)

最常被忽略的一点:哈希逻辑一旦上线,就不能随意改动。哪怕只是调整字段顺序或加个默认值,都可能导致缓存失效、集合查找不到原有 key——因为哈希值变了。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

6107

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

704

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5899

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2905

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3688

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2605

2025.08.29

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

0

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

0

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn