Python学习笔记 | 关于python数据对象 hashable & unhashable 的理解

本文探讨了Python中关于数据对象的可哈希性(hashable)与不可哈希性(unhashable)的概念,强调了不可变性在哈希过程中的重要性。内容包括hashable与unhashable的定义,mutable与immutable的区别,以及通过实例检测如何判断对象的哈希状态。文中还提及到元组是不可变且可哈希的,而列表和字典则是可变且不可哈希的。
摘要由CSDN通过智能技术生成


写在前面

Hash(哈希、散列)是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以在O(1)的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。

immutable(不可改变性)是指一些对象在被创建之后不会因为某些方式改变,特别是针对任何可以改变哈希对象的哈希值的方式。

由于hash key必须是不可变(immutable)的,对应的hash value才能是不变,所以不可变(immutable)和可哈希(hashable)是有关系的。如果hash key允许改变,那么像hashtable这样数据结构的对象将会改变,整个hash映射就都会失效。

具体以例来看,元组(tuple)对象是不可变的(immutable),字典(dict)的键(key)必须是可以哈希的(hashable)。

hashable & unhashable

官方文档:

如果一个对象在其生命周期内有一个固定不变的哈希值 (这需要__hash__()方法) 且可以与其他对象进行比较操作 (这需要__eq__()__cmp__()方法) ,那么这个对象就是可哈希对象 (hashable) 。可哈希对象必须有相同的哈希值才算作相等。

由于字典 (dict) 的键 (key) 和集合 (set) 元素使用到了哈希值,所以只有可哈希 (hashable) 对象才能被用作字典的键和集合的元素。

所有python内置的不可变(immutable)对象(tuple等)都是可哈希的,同时,可变容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。用户自定义的类的实例默认情况下都是可哈希的;它们跟其它对象都不相等 (除了它们自己) ,它们的哈希值来自id()方法。

mutable & immutable

(转自 https://www.jianshu.com/p/49f940b2c03e)

首先要明白的是当我们在聊可变与不可变对象时,我们聊的是Python的内置对象。自己定义的对象通常我们不去讨论它是不是可变的,毕竟Python本身是一门动态语言,需要的话我们随时可以给自己定义的这个对象添加其它的属性和方法。

提到Python内置的不可变对象我们能想到的往往有数字、字符串、元组等,提到Python内置的可变对象我们能想到的又有列表、字典等。我们是依据什么把其中的一些对象归于可变,又把另一些归于不可变的呢?
其实这种归类的办法很简单:当我们改变一个对象的值的时候,如果能维持其id值不变,我们就说这个对象是可变,否则我们就说这个对象不可变。

实例检测

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# unhashable 可变对象
# 如list、dict、set:同值不同址,不同值同址

# hashable 不可变对象
# 如int、str、char、tuple:同值同址,不同值不同址

# 怎么判断可变不可变 ?
# 改个值,看id是不是一样,id一样的为可变,则不可哈希。id出现变化,则为不可变,可哈希

# list
L = [1, 2, 3]
L2 = [1, 2, 3]
print('id(L)', id(L))
print('id(L2)', id(L2))
L[0] = 4
print('id(L)', id(L))   # unhashable

'''---------------------
id(L) 2763485176456
id(L2) 2763485176520
id(L) 2763485176456
---------------------'''

# dict
D = {
   'A':100, 'A-':90, 'B':80, 'C':70}
D2 = {
   'A':100<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值