Python debug——TypeError unhashable type(list/set/dict)
正如錯誤提示,list/set/dict 均不可被哈希。
這一異常通常出現在,調用 set(…) 來構造一個 set (集合類型)時,set() 需要傳遞進來可哈希的元素(hashable items)。
-
(1)list、set、dict:是不可哈希的
>>> list.__hash__ None >>> set.__hash__ None >>> dict.__hash__ None
- 1
- 2
- 3
- 4
- 5
- 6
-
(2)int、float、str、tuple:是可以哈希的
>>> int.__hash__ <slot wrapper ‘__hash__‘
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
(3)list 不使用 hash 值進行索引,故其對所存儲元素沒有可哈希的要求;set / dict 使用 hash 值進行索引,也即其要求欲存儲的元素有可哈希的要求。
>>> set([[], [], []]) TypeError: unhashable type: ‘list‘ >>> set([{}, {}, {}]) TypeError: unhashable type: ‘dict‘ >>> set([set(), set(), set()]) TypeError: unhashable type: ‘set‘
- 1
- 2
- 3
- 4
- 5
- 6
-
(4)dict 僅對鍵(key)有可哈希的要求,對值(value)無此要求。
>>> dict([[["zhangsan", "lisi"], 20]]
- 1
- 2
註:可能你會問,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]
是不可哈希的。
為什麽 list 是不可哈希的,而 tuple 是可哈希的
-
(1)因為 list 是可變的在它的生命期內,你可以在任意時間改變其內的元素值。
-
(2)所謂元素可不可哈希,意味著是否使用 hash 進行索引
-
(3)list 不使用 hash 進行元素的索引,自然它對存儲的元素有可哈希的要求;而 set 使用 hash 值進行索引。
References
[1] TypeError : Unhashable type
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
Python debug——TypeError unhashable type(list/set/dict)