Python中可哈希和不可變

Python中hashable和immutable

初學Python,我們清楚元組對象是不可變的(immutable),字典的鍵必須是可以哈希的(hashable)。這一講我們就來好好聊聊這兩個概念到底是什麼意思。

1. 可變與不可變

首先明確可變與不可變對象,我們默認的是Python的內置對象。自定義的對象我們不去討論,畢竟Python是一門動態語言,需要的話我們隨時可以改變自定義對象的可變性。

Python內置的不可變對象有數字類型、字符串類型、元組等,Python內置的可變對象有列表、字典、集合等。我們是依據什麼把其中的一些對象歸於可變,又把另一些歸於不可變的呢?依據很簡單:當改變一個對象的值,如果其id值不變,那麼對象是可變類型,反之對象爲不可變類型

2. 可哈希對象

先來看一下官方文檔上面對hashable的說明:

如果一個對象在其生命週期內有一個固定不變的哈希值 (這需要__hash__()方法) 且可以與其他對象進行比較操作 (這需要__eq__()方法) ,那麼這個對象就是可哈希對象 (hashable) 。可哈希對象必須有相同的哈希值纔算作相等。

由於字典 (dict) 的鍵 (key) 和集合 (set) 內部使用到了哈希值,所以只有可哈希 (hashable) 對象才能被用作字典的鍵和集合的元素。

所有python內置的不可變對象都是可哈希的,同時,可變容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。用戶自定義的類的實例默認情況下都是可哈希的;它們跟其它對象都不相等 (除了它們自己) ,它們的哈希值來自id()方法。

補充下對象的id值與哈希值之間的關係。首先要知道的是在id值相同的情況下,哈希值必然相同。id唯一確定一個對象,同一個對象哈希值也是唯一的。然後,在id不同的情況下哈希值通常不同,但這個在Python內置的對象裏是可以有例外的。

3. 小結

可變與不可變的依據是對象的在Python進程中唯一的ID,可哈希依據的是__hash__和__eq__方法,內置Python基本類型不可變類型都是可哈希的,而可變類型都是不可哈希的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章