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

相关推荐
aifannihao2 小时前
AI 学习第 14 课:CNN 训 6 轮卡在 0.5352,数据没打乱
pytorch·python·深度学习·cnn·学习路线
yuyuxun13 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
如夏倾城3 小时前
百度文心(容易被忽略的好用AI)使用方式
人工智能·python·百度·语言模型·dubbo
用户019027581613 小时前
quotes 实时价和 klines 最新收盘价为什么对不上?
python
another heaven3 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
少司府4 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
打工仔折腾 AI5 小时前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化
火云代理5 小时前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip
SomeOtherTime5 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain5 小时前
C++转Java日记(10)
java·开发语言