1. 程式人生 > >Python debug——TypeError: unhashable type(list/set/dict)

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

(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 值進行索引。