当前位置:
首页 > Python基础教程 >
-
Python中`hash()`函数的使用
在Python中,`hash()`函数被用来获取对象的哈希值。哈希值是一个整数,通常用于在哈希表(如字典)中快速查找键。只有不可变的数据类型(如整数、浮点数、字符串、元组等)才有哈希值,而可变的数据类型(如列表、字典、集合等)没有固定的哈希值,因此它们不能直接用作字典的键。
下面是`hash()`函数的一些基本用法示例:
# 整数
print(hash(123)) # 输出整数的哈希值
# 浮点数(虽然不常用作字典键,但它们有哈希值)
print(hash(3.14)) # 输出浮点数的哈希值
# 字符串
print(hash('hello')) # 输出字符串的哈希值
# 元组(因为元组是不可变的)
print(hash((1, 2, 3))) # 输出元组的哈希值
# 尝试对列表使用hash()会抛出TypeError
# print(hash([1, 2, 3])) # TypeError: unhashable type: 'list'
# 自定义对象的哈希值(需要实现__hash__方法)
class MyClass:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj = MyClass(123)
print(hash(obj)) # 输出自定义对象的哈希值,基于其value属性的哈希值
print(hash(123)) # 输出整数的哈希值
# 浮点数(虽然不常用作字典键,但它们有哈希值)
print(hash(3.14)) # 输出浮点数的哈希值
# 字符串
print(hash('hello')) # 输出字符串的哈希值
# 元组(因为元组是不可变的)
print(hash((1, 2, 3))) # 输出元组的哈希值
# 尝试对列表使用hash()会抛出TypeError
# print(hash([1, 2, 3])) # TypeError: unhashable type: 'list'
# 自定义对象的哈希值(需要实现__hash__方法)
class MyClass:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj = MyClass(123)
print(hash(obj)) # 输出自定义对象的哈希值,基于其value属性的哈希值
请注意,在自定义类时,如果你重写了`__eq__`方法(用于比较对象是否相等),通常也应该重写`__hash__`方法,以确保当两个对象相等时,它们的哈希值也相等。如果两个对象在`__eq__`方法中比较为相等,但它们的哈希值不同,这会导致哈希表(如字典)的行为不一致。
另外,如果自定义类是可变的,并且你希望其实例能够作为字典的键,那么你需要非常小心地实现`__hash__`方法,以确保在对象的生命周期中哈希值不会改变。如果对象的哈希值改变了,那么它就不能再作为字典的键,因为哈希表无法再找到它。因此,对于可变对象,通常不建议重写`__hash__`方法,而是让它们保持默认的未哈希化状态。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python49365.html
栏目列表
最新更新
vbscript基础篇 - vbs数组Array的定义与使用方
vbscript基础篇 - vbs变量定义与使用方法
vbs能调用的系统对象小结
vbscript网页模拟登录效果代码
VBScript 根据IE窗口的标题输出ESC
杀死指定进程名称的小VBS
通过vbs修改以点结尾的文件的属性为隐藏
查询电脑开关机时间的vbs代码
VBA中的Timer函数用法
ComboBox 控件的用法教程
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比