首页 > 编程语言 >Python中得可变哈希不可变哈希

Python中得可变哈希不可变哈希

时间:2023-01-27 23:12:44浏览次数:47  
标签:hash key Python 中得 哈希 print 内存地址 id

类型与哈希

哈希(散列计算),可以将任意长度的输出,通过散列算法变为固定长度输出,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
​
​
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

相关文章

  • Python字符串
    1.replace替换#replace实现字符串替换a='sjbfnjajjkdgbnv'a=a.replace('f','里')print(a)out:sjb里njajjkdgbnv整个过程,实际是创建了新的字符串对象,并指向了变量a,并......
  • [转]python发邮件smtplib和email模块详解
    本文转自:https://www.cnblogs.com/auguse/articles/14578247.htmlSMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,......
  • [转]用Python自动化操作PPT
    本文转自:https://jishuin.proginn.com/p/763bfbd771b6作者:超级大洋葱806https://tangxing.blog.csdn.net/article/details/1095688301.PPT自动化能干什么?有什么优势?它......
  • [转]利用python的PyPDF2和PyMuPDF库玩转PDF的提取、合并、旋转、缩放、加密
    本文转自:https://www.cnblogs.com/steven0325/p/16888425.html一、安装PyPDF2和PyMuPDF库pipinstallPyPDF2pipinstallpymupdf#fitz是pymupdf的子模块二、工具......
  • [转]python库 Pywin32使用
    本文转自:https://www.cnblogs.com/chenjy1225/p/12174889.htmlpython库Pywin32使用 https://github.com/wuxc/pywin32docPywin32提供了很多访问windows的API。较重......
  • [转] python-docx
    https://python-docx.readthedocs.io/en/latest/ https://gitcode.net/mirrors/python-openxml/python-docx/-/tree/master/docx python-docxReleasev0.8.11(Inst......
  • [转]Python3 xlrd库基本教程
    本文转自:https://www.w3cschool.cn/python3/python3-xlrd.htmlxlrd库是一个python用于操作excel的第三方库。它的主要功能是用来读取excel。通常会与xlwt 、 xlutils组......
  • Python——02.变量
    变量概念:--变量:将数据临时存储在内存中,该内存名字就是变量,此内存为内存储,相对应的外存储为永久存储举例:手机存储量12(内存储:临时)+286G(外存储)查看内......
  • [python3.10] 引用第三方库 PyMouse、PyKeyboard
    importPyMouse前提条件,__init__.py文件中将fromwindowsimportPyMouse,PyMouseEvent 改为  frompymouse.windows importPyMouse,PyMouseEventpyHook第......
  • Python入门笔记
    Python入门笔记Nowisbetterthannever.Althoughneverisoftenbetterthanrightnow.—————TheZenofPython,byTimPeters目录Python入门笔记1.前言py......