
Python判斷兩個對象相等的原理
大部分的python程序員平時編程的時候,很少關心兩個對象為什么相等,因為教程和經驗來說,他們就應該相等,比如1==1就應該返回True,可是當我們想要定義自己的對象或者修改默認的對象行為時,通常會因為不了解原理而導致各種奇奇怪怪的錯誤。
兩個對象如何相等
兩個對象如何才能相等要比我們想象的復雜很多,但核心的方法是重寫 eq 方法,這個方法返回True,則表示兩個對象相等,否則,就不相等。相反的,如果兩個對象不相等,則重寫 ne 方法。 默認情況下,如果你沒有實現這個方法,則使用父類(object)的方法。父類的方法比較是的兩個對象的ID(可以通過id方法獲取對象ID),也就是說,如果對象的ID相等,則兩個對象也就相等。因此,我們可以得知,默認情況下,對象只和自己相等。例如:
>>> class A(object):
... pass
...
>>>
>>> a = A()
>>> b = A()
>>> a == a
True
>>> a == b
False
>>> id(a)
4343310992
>>> id(b)
4343310928
Python2程序員經常犯的一個錯誤是,只重寫了 eq 方法,而沒有重寫 ne 方法,導致不可預計的錯誤。而Python3會自動重寫 ne 方法,如果你沒有重寫的話。
對象的Hash方法
Python里可Hash的對象,都有一個數字ID代表了它在python里的值,這個ID是由對象的 hash 方法返回的。因此,如果想讓一個對象可Hash,那必須實現 hash 方法和之前提到的 eq 方法。和對象相等一樣,默認情況下,對象的 hash 方法繼承自Object對象,而Object對象的 hash 方法只計算對象ID,因此兩個對象始終擁有兩個不一樣的hash id,不管他們是多么相似。 當我們把一個不可Hash的對象加入到set或者dict時,會發生什么了?
>>> set().add({})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
unhashable type: 'dict'
原因是set()和dict()使用對象的hash值作為內部索引,以便能快速索引到指定對象。因此,同一個對象返回相同的hash id就很重要了。
對象的Hash值在它的生命周期內不能改變
如果你想定義一個比較完美的對象,并且實現了 eq 和 hash 方法來定義對象的比較行為和hash值,那么你就需要保證對象的相關屬性不能發生更改。不然會導致很詭異的錯誤,比如下面的例子。
>>> class C:
... def __init__(self, x):
... self.x = x
... def __repr__(self):
... return "C({"+str(self.x)+"})"
... def __hash__(self):
... return hash(self.x)
... def __eq__(self, other):
... return (
... self.__class__ == other.__class__ and
... self.x == other.x
... )
>>> d = dict()
>>> s = set()
>>> c = C(1)
>>> d[c] = 42
>>> s.add(c)
>>> d, s
({C(1): 42}, {C(1)})
>>> c in s and c in d # c is in both!
True
>>> c.x = 2
>>> c in s or c in d # c is in neither!?
False
>>> d, s
({C(2): 42}, {C(2)}) # but...it's right there!
在我們沒有修改對象的屬性時(c.x=2)之前,所有行為都符合預期。當我們通過c.x=2時修改屬性后,執行c in s or c in d返回False,但是內容卻是修改后的,是不是很奇怪。這也就解釋了為什么str、tuple是可Hash的,而list和dict是不可hash的。
因此我們可以得出結論,如果兩個對象相等的話,那它們的hash值必然也是相等的。
總結
講了這么多有什么用了。 1. 當我們遇到unhashable type這個異常時,我們能夠知道為什么報這個錯誤。 2. 如果定義了一個可比較的對象,那么最好保證對象hash值相關的屬性在生命周期內不能發生改變,不然會發生意想不到的錯誤。
以上所述是小編給大家介紹的Python判斷兩個對象相等的原理,希望對大家有所幫助
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25