概述
List为什么不能作为key
至于这个问题,最直接的答案就是:list没有支持__hash__方法,那么为什么呢?
对于list的hash函数,我们可能有下面两种实现的方式:
第一种,基于id。这满足条件,“如果hash值不同,那么他们的id当然不同”。但考虑到list一般是作为容器,基于id来hash可能会导致下面两种情况:
用相同的list作为key去字典中找某个元素可能会得到不同的结果,因为是基于id hash的,所以即使他们的内容相同,字典依然将他们作为不同的元素对待。 创建一个一模一样的list用字典查找永远会得到一个KeyError。
第二种,基于内容。tuple就是这样做的,但是要注意一点,list是可以修改的。当list修改之后,你就永远别想再从字典中拿回来了。见下面的代码。
>>> l = [1, 2] >>> d = {} >>> d[l] = 42 >>> l.append(3) >>> d[l] # 原来的hash值是基于[1, 2]hash的, # 现在是基于[1, 2, 3],所以找不到 Traceback (mostrecentcalllast): File "", line 1, in ? KeyError: [1, 2, 3] >>> d[[1, 2]] # 基于hash [1, 2] # 但是遍历的时候找不到key相等的键值对 #(因为字典里的key变成了[1, 2, 3] Traceback (mostrecentcalllast): File "", line 1, in ? KeyError: [1, 2]
鉴于两种实现的方式都存在一定的副作用,所以Python规定:
内置的list不能作为字典的key.
但tuple是不可变,所以tuple可以作为字典的key。
作者:Darker_坤
链接:https://www.jianshu.com/p/56691574ef9e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
最后
以上就是高兴刺猬为你收集整理的list为什么不能作为字典的key的全部内容,希望文章能够帮你解决list为什么不能作为字典的key所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复