哈希表作為基礎數據結構我不多說,有興趣的可以百度,或者等我出一篇博客來細談哈希表。我這里就簡單講講:哈希表不過就是一個定長數組,元素找位置,遇到哈希沖突則利用 hash 算法解決找另一個位置,如果數組長度不夠用則進行擴容,然后不斷地循環反復。
我們提到了字典和集合是由哈希表實現的,具體的實現過程是怎么樣的呢?
其實很簡單,字典里面有取值,添加值,正好對應的就是哈希表中的find和add方法。使用__getitem__和__setitem__代替兩者就可以了。然后對於keys,values取值,只需要遍歷循環就行了。
這里需要注意一點,由於字典是由哈希表實現的,那么字典的key值就必須是可哈希的,否則該key值無法用哈希函數進行解析。
而集合其實就是字典,在字典的基礎上把所有key對應的value的值賦值1就行了,至於集合的各種方法,使用for循環判斷就行了。
再說說個人對可變類型不可哈希的原因,因為使用哈希函數的時候,如果對一個可變類型進行哈希,那么原數據類型會得到相應的改變。並且由於哈希表的數據結構是在不斷地在哈希沖突然后通過某種hash算法重新找位置的,如果在某個位置上這個值是個可變類型,那么可能在穩定的哈希結構中造成沖突,即破壞了已經穩定的哈希結構。