An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __ eq__() or __cmp__(). Hashable objects which compare equal must have the same hash value.
一個(gè)對象能被稱為 hashable 摔刁, 它必須有個(gè) hash 值愚隧,這個(gè)值在整個(gè)生命周期都不會(huì)變化蒙揣,而且必須可以進(jìn)行相等比較,所以一個(gè)對象可哈希眯杏,它必須實(shí)現(xiàn)__hash__() 與 __eq__() 方法夜焦。
Python 的某些鏈接庫在內(nèi)部需要使用hash值,例如往集合中添加對象時(shí)會(huì)用__hash__() 方法來獲取hash值岂贩,看它是否與集合中現(xiàn)有對象的hash值相同茫经,如果相同則會(huì)舍去不加入,如果不同萎津,則使用__eq__() 方法比較是否相等卸伞,以確定是否需要加入其中。
對于 Python 的內(nèi)建類型來說锉屈,只要是創(chuàng)建之后無法修改的(immutable)類型都是 hashable 如字符串荤傲,可變動(dòng)的都是 unhashable的比如:列表、字典颈渊、集合遂黍,他們在改變值的同時(shí)卻沒有改變id,無法由地址定位值的唯一性,因而無法哈希。我們自定義的類的實(shí)例對象默認(rèn)也是可哈希的(hashable)俊嗽,而hash值也就是它們的id()雾家。