【Python】尝试使用一个不可哈希的数据类型作为哈希表的键,错误提示builtins.TypeError,unhashable type

欢迎来到《小5讲堂》,大家好,我是全栈小5。
这是《Python》系列文章,每篇文章将以博主角度的理解展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

目录

  • 前言
  • 错误提示
  • 数据类型
    • 可哈希
    • 不可哈希
  • 代码举例
  • 什么是哈希
  • 文章推荐

前言

之前在测试一个大模型时,返回了一段python错误提示信息,
因此此篇文章将针对这个错误进行分析合讲解。

错误提示

builtins.TypeError: unhashable type: ‘list’
这个错误提示通常表示尝试使用一个不可哈希的数据类型作为哈希表的键(比如字典、集合等),例如传递一个列表作为键。
哈希表要求键是可哈希的,也就是说它们的值是不可变的,例如整数、浮点数、字符串等。
要解决这个错误,需要确保将可哈希的数据类型用作哈希表的键。
如果需要使用一个可变的数据类型作为键,可以考虑将其转换为元组或其他不可变类型。

数据类型

可哈希

在 Python 中,以下数据类型是可哈希的(immutable):
1.不可变的基本数据类型:整数(int)、浮点数(float)、复数(complex)、布尔值(bool)。
2.字符串(str)
3.元组(tuple)
这些数据类型可以作为字典的键或集合的元素,因为它们的值不可变,可以保证在哈希表中的唯一性和不变性。

不可哈希

另一方面,以下是不可哈希的(mutable)数据类型,不能用作字典的键或集合的元素:
1.列表(list)
2.字典(dict)
3.集合(set)
4.集合(frozenset)

需要注意的是,即使某个类的实例是可变的,如果类定义了 hash() 方法并且实例的所有属性都是可哈希的,那么这个实例也是可哈希的。

代码举例

这个错误通常发生在尝试使用列表作为字典的键或集合的元素时。
在 Python 中,列表是不可哈希的,因为它们是可变的,即列表的值可以更改。
因此,Python 不允许将列表用作字典的键或集合的元素,因为这可能会导致哈希表的不一致性。
要解决这个问题,需要确保在使用字典或集合时,将可哈希的数据类型用作键或元素。
如果需要使用列表,可以考虑将其转换为元组,因为元组是不可变的,可以用作字典的键或集合的元素。
以下是一个示例,演示了如何避免使用列表作为字典的键或集合的元素:

# 错误示例
my_dict = {}
my_list = [1, 2, 3]

my_dict[my_list] = "value"  # 这会导致 TypeError: unhashable type: 'list'

# 正确示例
my_dict = {}
my_tuple = (1, 2, 3)

my_dict[my_tuple] = "value"  # 这样可以正常工作

# 或者将列表转换为元组
my_dict = {}
my_list = [1, 2, 3]
my_tuple = tuple(my_list)

my_dict[my_tuple] = "value"  # 这样也可以正常工作

确保在使用字典或集合时遵循这些规则,就可以避免 TypeError: unhashable type: ‘list’ 这类错误了。

什么是哈希

在Python中,哈希(Hash)是一种将任意长度的输入数据映射为固定长度的输出数据的过程。
哈希函数会将输入数据转换为一个固定长度的哈希值,通常是一个字符串或数字。
哈希函数的特点是,对于相同的输入,始终会生成相同的哈希值,但即使输入数据仅有微小的变化,也会导致哈希值完全不同。
在Python中,哈希常常用于数据加密、数据校验、数据索引等方面。
Python中的字典(dict)就是基于哈希表实现的,哈希表能够提供快速的数据查找、插入和删除操作。在Python中,可以使用hash()函数来获取对象的哈希值。
以下是Python中哈希的代码示例:

# -*- coding: utf-8 -*-

# 获取字符串的哈希值
print("第一个:"+str(hash("hello")))

# 获取整数的哈希值
print("第二个:"+str(hash(42)))

# 获取列表的哈希值(列表是不可哈希的,会抛出异常)
try:
    print("第三个:"+str(hash([1, 2, 3])))
except TypeError as e:
    print("第四个:"+"TypeError:", e)

# 获取元组的哈希值(元组是可哈希的)
print("第五个:"+str(hash((1, 2, 3))))

输出结果会显示字符串和整数的哈希值,而尝试获取列表的哈希值会抛出TypeError异常,因为列表是不可哈希的。元组是可哈希的,因此可以成功获取其哈希值。

文章推荐

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

【Python】简单使用C/C++和Python嵌套for循环生成一个小爱心

【Python】Python3 使用selenium模块实现简单爬虫系列一

【Python】Python基础学习之python版本对应MySQL-python版本查看

【Python】Python基础学习之python版本对应pip版本查看

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

版权声明:本文为博主作者:全栈小5原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/lmy_520/article/details/136702275

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2024年4月1日
下一篇 2024年4月1日

相关推荐