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 的可哈希性,则要求其中所有元素都必须可哈希。

相关推荐
李永奉1 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
小oo呆1 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦2 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up2 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室2 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
杨丰玮4182 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
程序猿编码3 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
XiaoMaqqqq3 小时前
知名的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
言乐63 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame