Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?

Tuple 属于 Python 的不可变数据类型。

这里的"不可变"可以简单理解为:

Tuple 创建以后,每个位置所指向的对象不能被替换。

例如:

python 复制代码
t = (10, 20, 30)

可以读取:

python 复制代码
t[1]      # 20

但不能:

python 复制代码
t[1] = 100

因为这会让位置 1 改去指向另一个对象。


Tuple 可以包含可变对象

例如:

python 复制代码
t = (10, [20, 30])

这是允许的。

虽然不能:

python 复制代码
t[1] = [40, 50]

但是可以:

python 复制代码
t[1].append(40)

得到:

python 复制代码
(10, [20, 30, 40])

原因是:

text 复制代码
t[1] → 原来的 List

这个指向没有发生变化,只是 List 自己内部的数据改变了。


Tuple 是否可 Hash,要看里面的元素

例如:

python 复制代码
t = (10, 20, 30)

hash(t)

可以正常执行,因为:

text 复制代码
10 → 可 Hash
20 → 可 Hash
30 → 可 Hash

所以整个 Tuple 可 Hash。

但是:

python 复制代码
t = (10, [20, 30])

hash(t)

会报错:

text 复制代码
TypeError: unhashable type: 'list'

因为其中的:

python 复制代码
[20, 30]

是 List,而 List 不可 Hash。

因此:

Tuple 虽然本身不可变,但只有其中所有元素都可 Hash 时,整个 Tuple 才可 Hash。

例如:

text 复制代码
(1, 2, 3)          → 可以 Hash
("A", "B")         → 可以 Hash
(1, (2, 3))        → 可以 Hash
(1, [2, 3])        → 不可以 Hash

一句话总结

Tuple 的不可变,说的是每个位置所指向的对象不能被替换;Tuple 的可哈希性,则要求其中所有元素都必须可哈希。

相关推荐
昵称画14 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”14 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
传奇开心果编程14 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
Linux_cy14 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi120314 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami15 小时前
【无标题】
开发语言·python
CodeGL15 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer16 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_9679801117 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
卡卡~~17 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法