您好,登錄后才能下訂單哦!
本篇文章為大家展示了Python中兩個對象為什么相等?原理是什么?代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
大部分的python程序員平時編程的時候,很少關(guān)心兩個對象為什么相等,因為教程和經(jīng)驗來說,他們就應(yīng)該相等,比如1==1就應(yīng)該返回True,可是當(dāng)我們想要定義自己的對象或者修改默認(rèn)的對象行為時,通常會因為不了解原理而導(dǎo)致各種奇奇怪怪的錯誤。
兩個對象如何相等
??兩個對象如何才能相等要比我們想象的復(fù)雜很多,但核心的方法是重寫eq方法,這個方法返回True,則表示兩個對象相等,否則,就不相等。相反的,如果兩個對象不相等,則重寫ne方法。
??默認(rèn)情況下,如果你沒有實現(xiàn)這個方法,則使用父類(object)的方法。父類的方法比較是的兩個對象的ID(可以通過id方法獲取對象ID),也就是說,如果對象的ID相等,則兩個對象也就相等。因此,我們可以得知,默認(rèn)情況下,對象只和自己相等。例如:
>>> class A(object): ... pass ... >>> >>> a = A() >>> b = A() >>> a == a True >>> a == b False >>> id(a) 4343310992 >>> id(b) 4343310928
??Python2程序員經(jīng)常犯的一個錯誤是,只重寫了eq方法,而沒有重寫ne方法,導(dǎo)致不可預(yù)計的錯誤。而Python3會自動重寫ne方法,如果你沒有重寫的話。
對象的Hash方法
??Python里可Hash的對象,都有一個數(shù)字ID代表了它在python里的值,這個ID是由對象的hash方法返回的。因此,如果想讓一個對象可Hash,那必須實現(xiàn)hash方法和之前提到的eq方法。和對象相等一樣,默認(rèn)情況下,對象的hash方法繼承自O(shè)bject對象,而Object對象的hash方法只計算對象ID,因此兩個對象始終擁有兩個不一樣的hash id,不管他們是多么相似。
??當(dāng)我們把一個不可Hash的對象加入到set或者dict時,會發(fā)生什么了?
>>> set().add({}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict' unhashable type: 'dict'
原因是set()和dict()使用對象的hash值作為內(nèi)部索引,以便能快速索引到指定對象。因此,同一個對象返回相同的hash id就很重要了。
上述內(nèi)容就是Python中兩個對象為什么相等?原理是什么?,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。