TypeError: unhashable type(list/set/dict)【解决办法】

今天爱分享给大家带来TypeError: unhashable type(list/set/dict)【解决办法】,希望能够帮助到大家。

正如错误提示,list/set/dict 均不可被哈希。

这一异常通常出现在,调用 set(…) 来构造一个 set (集合类型)时,set() 需要传递进来可哈希的元素(hashable items)。

>>> list.__hash__
None
>>> set.__hash__
None
>>> dict.__hash__
None

int、float、str、tuple:是可以哈希的

>>> int.__hash__
<slot wrapper '__hash__' of 'int' objects>
>>> float.__hash__
<slot wrapper '__hash__' of 'float' objects>
>>> str.__hash__
<slot wrapper '__hash__' of 'str' objects>
>>> tuple.__hash__
<slot wrapper '__hash__' of 'tuple' objects>

list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求;set / dict 使用 hash 值进行索引,也即其要求欲存储的元素有可哈希的要求。

>>> set([[], [], []])
TypeError: unhashable type: 'list'
>>> set([{}, {}, {}])
TypeError: unhashable type: 'dict'
>>> set([set(), set(), set()])
TypeError: unhashable type: 'set'

dict 仅对键(key)有可哈希的要求,对值(value)无此要求。

>>> dict([[["zhangsan", "lisi"], 20]])
TypeError: unhashable type: 'list'

注:可能你会问,set 不是可以接受 list,并将其转换为 set 吗?比如set([1, 2, 3]),注意,上文说的可哈希,不可哈希,是对可迭代类型(iterables)所存储元素(elements)的要求,[1, 2, 3]是可迭代类型,其存储元素的类型为int,是可哈希的,如果set([[1, 2], [3, 4]]),[[1, 2], [3, 4]]list of lists(list 构成的 list)自然是可迭代的,但其元素为 [1, 2] 和 [3, 4]是不可哈希的。

人已赞赏
Python

error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory【问题解决】

2020-10-24 17:24:37

Python

为什么 list 是不可哈希的,而 tuple 是可哈希的【面试题】

2020-10-25 18:31:10

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧