一、哈希的目的:相同的key必须有相同的哈希值;对象的值(key)要与hash的值(value)一一对应;
a = [1, 2]
b = [1, 2]
a与b值相同,但根据他们不同的地址计算的哈希值不同
a = [1, 2]
a.append(3)
a前后的值已经变化,但由于a的地址没有变化,所以计算的哈希值仍然相同
二、哈希的过程:
在python里,是通过获取对象(key)的地址,然后再去计算哈希值(value);
所以可哈希的前提是对象的值要与对象的地址是固定的,不能改变;
三、为什么不可变的数据类型可用于哈希
对于不可变类型而言,不同的值意味着不同的内存,相同的值存储在相同的内存
不可变的数据类型的值(key)和相应的地址(value)是固定且一一对应的,所以可用于哈希
比如说:int float bool str tuple 自定义类的对象;key不变,value就不变,key变,value就变
a = 5
b = 5
print(id(a), id(b), id(5))
1512926400 1512926400 1512926400
四、为什么可变的数据类型不可用于哈希
可变的数据类型列表、集合、字典等;
ex1: a = [1, 2, 3] a.append(4); a的地址是没变的,但value变了,如果可hash,那么hash值也是固定的,即value也是不变的,其结果是不同的key映射到相同的value
ex2: d = {[1, 2], "aaaa"} , d[1,2]是无法取到"aaaa"值的,因为第一个[1,2]与第二个[1,2]地址是不同的,所以计算的哈希值也不同,即无法获取对应的value
所以可变的数据类型不符合哈希的目的,即为不可哈希的对象
a=[1,2,3]
print(id(a))
def func(p):
p.append(4)
return p
b=func(a)
print(id(b))
86263944
86263944
![在这里插入图片描述](https://img-blog.csdnimg.cn/af4e9048950446d7ba47dba0cf613efb.png)