Python判斷兩個物件相等的原理

2022-10-04 20:39:15 字數 2439 閱讀 8700

概述

大部分的python程式設計師平時程式設計的時候,很少關心兩個物件為什麼相等,因為教程和經驗來說,他們就應該相等,比如1==1就應該返回true,可是當我們想要定義自己的物件或者修改預設的物件行為時,通常會因為不了解原理而導致各種奇奇怪怪的錯誤。

兩個物件如何相等

兩個物件如何才能相等要比我們想象的複雜很多,但核心的方法是重寫 eq 方法,這個方法返回true,則表示兩個物件相等,否則,就不相等。相反的,如果兩個物件不相等,則重寫 ne 方法。 預設情況下,如果你沒有實現這個方法,則使用父類(object)的方法。父類的方法比較是的兩個物件的id(可以通過id方法獲取物件id),也就是說,如果物件的id相等,則兩個物件也就相等。因此,我們可以得知,預設情況下,物件只和自己相等。例如:

>>> class a(object):

... pass

...>>>

>>> a = a()

>>> b = afgfwertxq()

>>> 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 "", line 1, in

typeerror: unhashable type: 'dict'

unhashable type: 'dict'

原因是set()和dict()使用物件的hash值作為內部索引,以便能快速索引到指定物件。因此,同乙個物件返回相同的hash id就很重要了fgfwertxq。

物件的hash值在它的生命週期內不能改變

如果你想定義乙個比較完美的物件,並且實現了 eq 和 hash 方法來定義物件的比較行為和hash值,那麼你就需要保證物件的相關屬性不能發生更改。不然會導致很詭異的錯誤,比如下面的例子。

>>> class c:

... def __init__(self, x):

... self.x = x

... def __repr__(self):

... return "c()"

... 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 in s and c in d # c iwww.cppcns.coms in both!

true

>>> c.x = 2

>>> c in s or c in d # c is in neither!?

false

>>> d, s

(, ) # 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判斷兩個物件相等的原理

本文位址: /jiaoben/python/214127.html

js怎麼判斷兩個物件相等?

es6 中有乙個方法判斷兩個物件是否相等,這個方法判斷是兩個物件引用位址是否一致 let obj1 let obj2 console.log object.is obj1,obj2 false let obj3 obj1 console.log object.is obj1,obj3 true co...

List Set Map判斷兩個物件相等的標準

list 通過equals 方法比較返回true即可。hashset 先比較兩個物件hashcode 方法返回的值是否相等,如果不相等就認為兩個物件是不相等的,如果兩個物件的hashcode相等就繼續呼叫equals 方法進一步判斷兩個物件是否相等,如果equals 方法返回true認為兩個物件相等...

Python兩個物件相等的原理

大部分的python程式設計師平時程式設計的時候,很少關心兩個物件為什麼相等,因為教程和經驗來說,他們就應該相等,比如1 1就應該返回true,可是當我們想要定義自己的物件或者修改預設的物件行為時,通常會因為不了解原理而導致各種奇奇怪怪的錯誤。兩個物件如何才能相等要比我們想象的複雜很多,但核心的方法...