0

0

Python 为什么 list 不能作为字典 key?哈希条件说明

舞夢輝影

舞夢輝影

发布时间:2026-01-21 19:25:02

|

972人浏览过

|

来源于php中文网

原创

list不可哈希,因它是可变类型,不满足哈希要求:生命周期内哈希值不变且等值对象哈希值相同;字典key必须可哈希才能正确寻址;常见可哈希类型包括int、str、tuple(元素皆可哈希)、frozenset等;可用tuple(my_list)等方式转换list为可哈希形式。

python 为什么 list 不能作为字典 key?哈希条件说明

因为 list 是可变类型,不满足哈希(hashable)要求,而字典的 key 必须是不可变且可哈希的对象。

什么是可哈希(hashable)?

一个对象是可哈希的,当且仅当它满足两个条件:

  • 整个生命周期中,哈希值不变(即 hash(obj) 每次调用返回相同整数);
  • 与另一个相等对象(== 为 True)具有相同的哈希值(即满足哈希一致性)。

只有满足这两点,对象才能安全地用作字典 key 或集合元素——因为字典底层靠哈希值快速定位桶(bucket),若 key 的哈希值中途改变,就再也找不回原来存的数据了。

为什么 list 不可哈希?

list 是可变容器,它的内容可以随时被修改:

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

Cliclic AI
Cliclic AI

Cliclic商品背景图编辑器是一款功能强大的AI工具,帮助用户快速生成具有吸引力的商品图背景。

下载
  • a = [1, 2]; hash(a) 会直接报错:TypeError: unhashable type: 'list'
  • 即使绕过检查(如自定义类模拟 list 行为),一旦你 a.append(3),它的逻辑“身份”就变了,但字典无法感知或响应这种变化;
  • 更关键的是,Python 明确规定:所有可变内置类型(listdictset)默认不可哈希,这是语言层面的硬性约束,不是实现细节。

哪些类型可以当 dict key?

常见可哈希类型包括:

  • 数值型:intfloat(非 NaN)、complex
  • 字符串:str
  • 元组:tuple——但要求其**所有元素都可哈希**(例如 (1, "a", (2, 3)) ✅,而 (1, [2]) ❌);
  • 冻结集合:frozensetset 不行,但 frozenset 是不可变的);
  • 自定义类实例:只要没重写 __hash__ 或显式设为 __hash__ = None,且没有可变状态影响相等性判断。

想用“类似 list”的结构当 key 怎么办?

核心思路:转成不可变且可哈希的等价形式:

  • tuple(my_list) —— 适合顺序敏感、元素可哈希的场景;
  • tuple(sorted(my_list)) —— 若只关心元素集合,不关心顺序;
  • frozenset(my_list) —— 若只关心元素存在性,且无重复、无需顺序;
  • json.dumps(my_list, sort_keys=True)(转为规范字符串)——适合嵌套结构,但注意浮点精度和类型限制。

例如:
d = {}; d[tuple([1, 2, 3])] = "value"
d[[1, 2, 3]] = "value" ❌ 报错

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

css中float用法
css中float用法

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

595

2024.04.28

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

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

108

2025.10.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号