可哈希与不可哈希的区别

一、哈希的目的:相同的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

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值