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