【Python】尝试使用一个不可哈希的数据类型作为哈希表的键,错误提示builtins.TypeError,unhashable type,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析与解决方案

马肤

温馨提示:这篇文章已超过413天没有更新,请注意相关的内容是否还可用!

摘要:在Python中,哈希表(如字典)的键必须是可哈希的类型。当尝试使用不可哈希的数据类型作为哈希表的键时,会引发TypeError错误,提示"unhashable type"。这是因为哈希表的工作原理依赖于键的哈希值来存储和检索数据,而不可哈希类型的对象无法生成固定的哈希值。为了解决这个问题,可以将不可哈希的类型转换为可哈希的类型,如使用元组或字符串表示形式来作为键。

在Python中,尝试使用不可哈希的数据类型作为哈希表的键会引发TypeError错误,哈希表要求键必须是可哈希的,而像列表和字典这样的不可哈希数据类型无法直接用作哈希表的键,因为它们内部状态可能发生变化,导致无法计算稳定的哈希值,为解决此问题,可以考虑将不可哈希的数据类型转换为可哈希的类型(如元组或字符串)后再作为哈希表的键。

【Python】尝试使用一个不可哈希的数据类型作为哈希表的键,错误提示builtins.TypeError,unhashable type,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析与解决方案 第1张

这是《Python》系列文章的一篇,每篇文章都将从博主的独特视角进行解读,特别是对知识点的概念进行详细阐述,并通过实际例子来验证和理解这些概念。

之前在测试一个大模型时,我遇到了一个Python错误提示信息,这篇文章将针对这个错误进行分析和讲解。

2、错误提示

当你看到builtins.TypeError: unhashable type: ‘list’这个错误时,通常表示你尝试使用一个不可哈希的数据类型(如列表)作为哈希表的键(如字典、集合等),在Python中,哈希表要求键是可哈希的,也就是说它们的值是不可变的,为避免这个错误,你需要确保使用可哈希的数据类型作为哈希表的键。

3、数据类型

在Python中,以下数据类型是可哈希的(immutable):整数(int)、浮点数(float)、布尔值(bool)、字符串(str)和元组(tuple),这些数据类型可以作为字典的键或集合的元素。

相反,列表(list)、字典(dict)、集合(set)和冻结集合(frozenset)是不可哈希的,不能用作字典的键或集合的元素,值得注意的是,即使某个类的实例是可变的,如果类定义了hash()方法并且实例的所有属性都是可哈希的,那么这个实例也是可哈希的。

4、代码举例

这个错误通常发生在尝试使用列表作为字典的键或集合的元素时,在Python中,列表是不可哈希的,因为它们是可变的,如果你尝试这样做,Python会抛出TypeError,要解决这个问题,你需要确保在使用字典或集合时,使用可哈希的数据类型作为键或元素,以下是一个简单的示例:

错误示例:

【Python】尝试使用一个不可哈希的数据类型作为哈希表的键,错误提示builtins.TypeError,unhashable type,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析,Python中不可哈希数据类型作为哈希表键引发的TypeError错误解析与解决方案 第2张

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"  # 这样可以正常工作

通过遵循这些规则,你可以避免这个常见的错误。

5、什么是哈希?

在Python中,哈希是一种将任意长度的输入数据映射为固定长度的输出数据的过程,哈希函数将输入数据转换为一个固定长度的哈希值,通常是一个字符串或数字,一个重要的特点是,对于相同的输入,哈希函数始终生成相同的哈希值,在Python中,哈希常用于数据加密、数据校验和快速数据查找,Python中的字典就是基于哈希表实现的,以下是获取Python中对象哈希值的示例:

获取字符串的哈希值:

print("第一个:"+str(hash("hello")))

获取整数的哈希值:

print("第二个:"+str(hash(42)))

尝试获取列表的哈希值(会抛出异常):

try:
    print("第三个:"+str(hash([1, 2, 3])))  # 这将抛出TypeError异常
except TypeError as e:
    print("第四个:TypeError:", e)

获取元组的哈希值(元组是可哈希的):

print("第五个:"+str(hash((1, 2, 3))))  # 这将返回一个整数作为元组的哈希值,注意这里的括号是必要的,没有括号的话元组会被解析为多个独立的参数而不是一个整体。(1, 2, 3)是可哈希的而与之对应的列表[1, 2, 3]则不是可哈希的,这一点很重要!因此在使用字典时需要注意区分这两者之间的区别,同时也要注意元组的不可变性使得它成为了一个可哈希的类型,因此在使用字典或者集合时我们可以使用元组作为键或者元素来避免遇到TypeError的错误提示信息,同时我们也需要注意到即使一个类的实例是可变的只要它定义了hash()方法并且实例的所有属性都是可哈希的那么它也是可哈希的这一点也为我们提供了解决这个问题的思路之一那就是通过自定义类来实现可哈希性以满足我们的需求。"温故而知新"通过不断复习和实践可以加深对知识点的理解和认识博主希望通过分享这些文章对大家有所帮助和启发也期待与更多优秀的新老博主交流学习共同进步!

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码