Python 为什么 list 不能作为字典 key?哈希条件说明
技术百科
舞夢輝影
发布时间:2026-01-21
浏览: 次 list不可哈希,因它是可变类型,不满足哈希要求:生命周期内哈希值不变且等值对象哈希值相同;字典key必须可哈希才能正确寻址;常见可哈希类型包括int、str、tuple(元素皆可哈希)、frozenset等;可用tuple(my_list)等方式转换list为可哈希形式。
因为 list 是可变类型,不满足哈希(hashable)要求,而字典的 key 必须是不可变且可哈希的对象。
什么是可哈希(hashable)?

- 整个生命周期中,哈希值不变(即
hash(obj)每次调用返回相同整数); - 与另一个相等对象(
==为 True)具有相同的哈希值(即满足哈希一致性)。
只有满足这两点,对象才能安全地用作字典 key 或集合元素——因为字典底层靠哈希值快速定位桶(bucket),若 key 的哈希值中途改变,就再也找不回原来存的数据了。
为什么 list 不可哈希?
list 是可变容器,它的内容可以随时被修改:
-
a = [1, 2]; hash(a)会直接报错:TypeError: unhashable type: 'list'; - 即使绕过检查(如自定义类模拟 list 行为),一旦你
a.append(3),它的逻辑“身份”就变了,但字典无法感知或响应这种变化; - 更关键的是,Python 明确规定:所有可变内置类型(
list、dict、set)默认不可哈希,这是语言层面的硬性约束,不是实现细节。
哪些类型可以当 dict key?
常见可哈希类型包括:
- 数值型:
int、float(非 NaN)、complex; - 字符串:
str; - 元组:
tuple——但要求其**所有元素都可哈希**(例如(1, "a", (2, 3))✅,而(1, [2])❌); - 冻结集合:
frozenset(set不行,但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" ❌ 报错
# 的是
# 这是
# 它是
# python
# 重写
# 自定义
# 不回
# app
# 设为
# js
# json
# 对象
# int
# 字符串
# 报错
# 为什么
# Float
# 浮点
# append
# 不满足
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Go 语言标准库为何不提供泛型 Contains
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win11如何关闭游戏模式 Win11禁用Xbox
- Win11局域网共享怎么设置 Win11文件夹网络
- Python随机数生成_random模块说明【指导
- Windows11怎么自定义任务栏_Windows
- Mac如何解压zip和rar文件?(推荐免费工具)
- Python网络异常模拟_测试说明【指导】
- Drupal 中 HTML 链接被双重转义导致渲染
- Win11怎么恢复误删照片_Win11数据恢复工具
- Win10如何设置双wan路由器 Win10双wa
- Win10怎样安装PPT模板_Win10安装PPT
- Python异步编程高级项目教程_asyncio协
- 如何使用Golang实现错误包装与传递_Golan
- Win11任务栏怎么固定应用 Win11将软件图标
- php怎么下载安装后设置默认字符集_utf8配置步
- Python解释执行模型_字节码流程说明【指导】
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么制作U盘启动盘_Win11原版系统安
- 如何在Golang中操作嵌套切片指针_Golang
- Win11怎么恢复出厂设置_Win11重置此电脑保
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么关闭资讯和兴趣_Windows11任
- 如何在Golang中实现CI/CD流水线自动化测试
- php下载安装选zip还是msi格式_两种安装包对
- Win11怎么查看局域网电脑_Windows 11
- c++ std::atomic如何保证原子性 c+
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Windows10无法连接到Internet_Wi
- Win11怎么更改计算机名_Windows11系统
- 如何在 Windows 11 中使用 AlomWa
- Python类装饰器使用_元编程解析【教程】
- LINUX的SELinux是什么_详解LINUX强
- Win10系统更新错误0x80240034怎么办
- php查询数据怎么分组_groupby分组查询配合
- Python装饰器设计思路_功能增强机制说明【指导
- 如何使用Golang sort排序切片_Golan
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Win11怎么解压RAR文件 Win11自带解压功
- 为什么Go需要go mod文件_Go go mod
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- Avalonia如何实现跨窗口通信 Avaloni
- 如何使用Golang配置安全开发环境_防止敏感信息
- Go语言中正确反序列化多个同级XML元素为结构体切
- Win11如何卸载OneDrive_Win11卸载
- PHP 中 require() 语句返回值的用法详
- Python代码测试策略_质量保障解析【教程】
- 如何在Windows中创建新的用户账户?(标准与管
- Linux如何安装JDK11_Linux环境变量配
- 如何高效识别并拦截拼接式恶意域名 spam

QQ客服