类型与哈希
哈希(散列计算),可以将任意长度的输出,通过散列算法变为固定长度输出,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
1.可哈希类型:
数字类型(int,float,bool)字符串str、元组tuple
注意:int与float类型通过hash计算后还是原来的值,取决于__hash__魔术方法的运算过程
bool:在通过hash运算后为1,0
可以理解为:当前变量值为key,那么hash运算后的值为value
使用str类型举例:
string1 = 'string'
string2 = 'str' + 'ing'
print(string2 == string1) # True
# 使用is判断对比(is内存地址是否相同)
print(string1 is string2) # True 说明内存地址相同
# 查看当前两个值的内存地址[是相同的]
print(id(string1)) # 2243838658608
print(id(string2)) # 2243838658608
# 通过hash函数查看计算后的哈希值
print(hash(string1), hash(string2)) # 1023839165698568095 1023839165698568095
# 如果可哈西变量发生变化,那么内存地址也会进行变化,[string2发生变化,就不会指向string1的内存地址,而是找到一个新的内存地址存储]
可以断定: 当前两个变量指向是同一块内存地址,那么hash值也相同,也满足了hash表的特点,通过变量元素找到key的内存地址
2.不可哈希类型:
list set dict(dict中得必须是可哈希类型的)
对于可变对象而言,比如一个列表,更改列表的值,但是对象的地址本身是不变的,也就是说不同的Key,映射到了相同的Value,这显然是不符合哈希值的特性的,即出现了哈希运算里面的冲突
可以理解为: 不可哈希类型中内部的值是可以变化的,但是占用的内存地址是不会变化的
利用列表为举例:
lis = [11,22,33]
print(id(lis)) # 内存地址为:2295695012736
lis.append('wkxxx') # 添加一个新的元素
print(id(lis)) # 内存地址为:2295695012736
内存地址不会变化,但是里面的值发生了变化
3.为什么dict中得key必须是可哈希的?
字典的哈希表实现使用从键值计算的哈希值来查找键
比如:
d = {[1, 2]: '100'} # 构造一个字典,key是列表[1,2] ,是一个可变对象,是不可哈希的
print(d[[1, 2]]) # 通过key去访问字典的值,TypeError错误
但是由于列表list是可变对象,虽然这两行的列表值一样,但是他们并不是同一个对象,它们的存储地址是不一样的,即id是不一样的,id不一样也导致了根据id计算得到的哈希值是不一样的,自然没有办法找到原来的那一个
'''
因为(不可哈希)可变类型,虽然值是相同的,但是内存地址不同,无法找到。
为什么用可哈希(不可变类型),你是用的值在内存中存储的都是相同的位置,比如:'xxx' ,那么怕10个变量使用这个值,那么也是执行当前这个值得内存地址的。另外字典的哈希表时从key进行计算哈希找到value的。如果是(不可哈希)可变类型,那么永远也找不到对应value
'''
标签:hash,key,Python,中得,哈希,print,内存地址,id
From: https://www.cnblogs.com/wkxz/p/17069507.html