官方文档解释
1)如果一个对象是可哈希的,则它是可被计算哈希值的(__hash__()
),以及是可比较的(__eq__()
)。
2)可哈希对象可作为字典的键,或集合的成员。
3)Python所有的内置不可变对象都是可哈希的。如:数值、字符串,元组、函数等。
4)列表,字典,集合是不可哈希的,因为它们在改变值的同时却没有改变内存 id(这意味着无法通过哈希值来确定唯一的对象),无法由地址定位值的唯一性,因而不可哈希。
>>> a = [1, 3, 8, 4] # 定义一个列表a
>>> id(a)
1628898035848
>>> a[1] = 5 # 改变列表的一个元素,显然 [1, 3, 8, 4] ≠ [1, 5, 8, 4]
>>> id(a) # 内存 id 没有变
1628898035848
当然,元组也可能出现,改变值的同时,id 也没有改变。
>>> t = (1, 3, a, 8) # 定义一个元组
>>> id(t)
1628898099672
>>> print(t)
(1, 3, [1, 5, 8, 4], 8)
>>> a[1] = 2
>>> print(t)
(1, 3, [1, 2, 8, 4], 8)
>>> id(t)
1628898099672