Python文檔中的解釋:
一個對象是可散列的,那么在它的生命周期中它的hash 值是不變的。
可散列的對象需要2個方法:__hash__()方法和__eq__()方法。兩個可散列的對象相等,那么它們的散列值相等。
可散列的對象可以作為字典的key,作為set的成員。但是字典,set本身是不可散列的。
Python所有內置的不可變的對象都是hashable,可變的容器(比如lists或dictionaries)不是hashable。
用戶定義的類的對象默認是hashable的,它們的hash值來自它們的id()。
Python hash()函數
描述
hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。
語法
hash 語法:
hash(object)
參數說明:
- object -- 對象;
-
返回值
返回對象的哈希值。
實例
以下實例展示了 hash 的使用方法:
hash() 函數可以應用於數字、字符串和對象,不能直接應用於 list、set、dictionary。
在 hash() 對對象使用時,所得的結果不僅和對象的內容有關,還和對象的 id(),也就是內存地址有關。
class Test: def __init__(self, i): self.i = i for i in range(10): t = Test(1) print(hash(t), id(t))
輸出結果:
(277855628, 4445690048) (277855637, 4445690192) (277855628, 4445690048) (277855637, 4445690192) (277855628, 4445690048) (277855637, 4445690192) (277855628, 4445690048) (277855637, 4445690192) (277855628, 4445690048) (277855637, 4445690192)
列表,字典,集合是無法散列的,因為它們在改變值的同時卻沒有改變id,無法由地址定位值的唯一性,因而無法散列。