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

Python debug——TypeError unhashable type(list/set/dict)

spa slot https 幽默 rap aml nts python tps

正如錯誤提示,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__‘
    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>
    • 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]]
    ) TypeError: unhashable type: ‘list‘
    • 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)