Python debug——TypeError: unhashable type(list/set/dict)
阿新 • • 發佈:2018-12-10
正如錯誤提示,list/set/dict 均不可被雜湊。
這一異常通常出現在,呼叫 set(…) 來構造一個 set (集合型別)時,set() 需要傳遞進來可雜湊的元素(hashable items)。
(1)list、set、dict:是不可雜湊的
>>> list.__hash__
None
>>> set.__hash__
None
>>> dict.__hash__
None
(2)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>
(3)list 不使用 hash 值進行索引,故其對所儲存元素沒有可雜湊的要求;set / dict 使用 hash 值進行索引,也即其要求欲儲存的元素有可雜湊的要求。
>>> set([[], [], []])
TypeError: unhashable type: 'list'
>>> set([{}, {}, {}])
TypeError: unhashable type: 'dict'
>>> set([set(), set(), set()])
TypeError: unhashable type: 'set'
(4)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]
是不可雜湊的。
為什麼 list 是不可雜湊的,而 tuple 是可雜湊的
(1)因為 list 是可變的在它的生命期內,你可以在任意時間改變其內的元素值。
(2)所謂元素可不可雜湊,意味著是否使用 hash 進行索引
(3)list 不使用 hash 進行元素的索引,自然它對儲存的元素有可雜湊的要求;而 set 使用 hash 值進行索引。