目錄
1. TypeError: unhashable type: 'list'
2. 何為哈希?
2.1 哈希
2.2 哈希表
2.3 Python中的哈希表的例子
3. Why list is unhashable?
1. TypeError: unhashable type: 'list'
這個錯誤通常意味著你試圖將一個list物件用作哈希引數(hash argument),有以下兩種典型(常見)的情況:
(1) 用作字典的鍵值
(2) 用作集合set的元素
myDict = {[1,2,3]:'123', 'name':'chenxy'}
mySet = set()
mySet.add([1,2,3])
以上兩個例子都將導致如題的錯誤,
原因是list是不能用作哈希值的(can't be hashed),通常的解決方案是將list轉換為tuple再使用,如下例所示:
myDict = {tuple([1,2,3]):'123', 'name':'chenxy'}
mySet = set()
mySet.add(tuple([1,2,3]))
print(myDict)
print(mySet)
運行結果如下:
{(1, 2, 3): '123', 'name': 'chenxy'}
{(1, 2, 3)}
2. 何為哈希?
2.1 哈希
哈希(hash)也成為散列,是計算機科學中的一個概念,它是指把任意長度的輸入,通過哈希演算法變換成固定長度的輸出,這個輸出值就是哈希(散列)值,實作這一演算法的函式就叫做哈希函式,哈希演算法最重要的特點就是:
- 相同的輸入一定得到相同的輸出;
- 不同的輸入大概率得到不同的輸出,
哈希函式就是實作了哈希演算法的函式,將輸入引數變換為一個唯一的(固定長度的)數,它可以接收任意一經初始化后就不會再變化的物件(從哈希函式來看就是一個長度不一的二進制字串)作為引數,這一特性通常被用于生成字典的鍵,有很多種哈希演算法,這里就不一一介紹,
python的內置函式hash()用于將輸入引數變換為其對應的哈希值,比如說:
hash(tuple([1,2,3]))
Out[93]: 529344067295497451
2.2 哈希表
哈希表(Hash table,也叫散串列),是根據關鍵碼值(Key value)而進行隨機訪問的資料結構,也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函式就是哈希函式,存放記錄的陣列叫做散串列,
2.3 Python中的哈希表的例子
python中的dict就是哈希表的一種實作,python中的set也是哈希表的一種實作,dict的元素是{key: value}對,而set可以看作是只有key而沒有value,dict中key必須保持唯一性,否則的話就無法實作正確查詢,set則由其定義可知其中的元素都是唯一(unique)的,因此兩者都以哈希表的方式來實作也就不足為怪,
3. Why list is unhashable?
哈希表要求用同一物件作為key查詢得到的結果保持不變(否則的話,每次查詢相同的key,回傳的值都不同就無法起到資料存盤的功能了),這就要求用作key的物件本身必須是保持不變的(immutable once it is initialized),如果一個物件是可變的,那它的內容一旦發生變化,它的二進制表示就會發生變化,以它為輸入經由哈希函式計算出來的哈希值也就發生變化了,因此以它為鍵值進行查詢而得到的結果也就與上次查詢結果不一樣,
list是mutable型別,tuple是immutable型別,因此list是unhashable的,不能用作dict的鍵,也不能作為set的元素,而tuple就可以,
Python中的hashable objects的例子:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
Python中的unhashable objects的例子:
list, dict, set, bytearray, user-defined classes
Reference:
[1] http://net-informations.com/python/iq/unhashable.htmhttp://net-informations.com/python/iq/unhashable.htm
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301873.html
標籤:python
