1. 程式人生 > 實用技巧 >Python 的對映資料型別有哪些?零基礎小白入門學習必看

Python 的對映資料型別有哪些?零基礎小白入門學習必看

1 對映類關係

Python 的 collections.abc 模組內擁有 Mapping 和 MutableMapping 這兩個抽象基類,它們為 dict 和其他類似的型別提供了介面定義。

mutable /ˈmjuːtəbl/ adj. Capable of or subject to change or alteration.

它們之間的類關係如下圖所示:

箭頭從子類指向父類,抽象類和抽象方法的名稱以斜體顯示。

首先是 Container、Iterable 與 Sized 三大介面,接著 Mapping 介面在繼承了前面三大介面的基礎上,又定義了一些自有介面。

這些介面定義了構建一個對映型別所需要的介面與方法。

2 判定對映型別

可以通過 isinstance() 方法來判定某個物件是不是廣義上的對映型別:

import collections
import logging

logging.basicConfig(level=logging.DEBUG, format='%(levelname)s - %(message)s')


my_dict = {}
result = isinstance(my_dict, collections.abc.Mapping)
logging.info('result -> %s', result)
複製程式碼

執行結果:

INFO - result -> True
複製程式碼

3 可雜湊的資料型別

Python 標準庫裡的所有對映型別都是利用 dict 來實現的,它們的鍵都必須是可雜湊的資料型別。

可雜湊的資料型別指的是:在這種資料型別物件的生命週期中,它的雜湊值是不變的。它會實現 __hash__() 方法與__qe__() 方法,後一種方法是用來與其他鍵做比較。如果兩個物件的雜湊值相等,那麼就可以判定這兩個物件相等。

原子不可變的資料型別(如:str、bytes 和數值型別)都是可雜湊資料型別。frozenset 中只能容納可雜湊型別,因此也是可雜湊資料型別。

frozenset() 會返回一個凍結的集合,凍結後集合不能再新增或刪除元素。

而元組比較特殊,只有當一個元組中所包含的元素都是可雜湊型別時,它才是可雜湊的。Luciano Ramalho 舉了一個示例來說明這一點。

tt = (1, 2, (30, 40))
logging.info('hash(tt) -> %s', hash(tt))

tf = (1, 2, frozenset([30, 40]))
logging.info('hash(tf) -> %s', hash(tf))

tl = (1, 2, [30, 40])
logging.info('hash(tl) -> %s', hash(tl))
複製程式碼

執行結果:

INFO - result -> True
INFO - hash(tt) -> 8027212646858338501
INFO - hash(tf) -> 985328935373711578
TypeError: unhashable type: 'list'
複製程式碼

示例中可以看到:元組內包含了一個非雜湊的列表,就會丟擲 TypeError 異常。

一般情況下,使用者自定義型別的物件都是可雜湊的,雜湊值就是這些物件 id() 函式的返回值,因此這些物件在比較的時候都是不相等的。

本文章素材來源於網路,如有侵權請聯絡刪除。