Python 中 `__eq__`、`is` 和 `==` 的區別
Python 中的 `__eq__`、`is` 和 `==` 運算子用於比較物件的相等性。`__eq__` 方法檢查相同類物件的相等性,或者如果我們想建立自定義比較函式。`is` 運算子檢查兩個物件的記憶體位置,而 `==` 運算子僅檢查被比較的兩個物件的值。在本文中,我們將討論這三個運算子之間的區別及其用途。
方法 |
功能 |
語法 |
---|---|---|
__eq__ |
檢查相同類物件的兩個物件的值是否相等 |
def __eq__(self,other) |
is |
檢查兩個物件是否具有相同的記憶體位置 |
a is b |
== |
檢查兩個物件的值 |
a == b |
`__eq__()` 方法
Python 中的 `__eq__` 方法用於定義如何比較類的物件的相等性。`__eq__` 方法接受兩個引數:`self`(`==` 運算子左側的物件)和 `other`(`==` 運算子右側的物件)。`__eq__` 方法始終返回布林值(True 或 False)。如果返回的不是布林值,則會導致 TypeError。
示例
在下面的示例中,我們建立了一個名為 `Person` 的類,它有兩個屬性,分別是 `name` 和 `age`。然後,我們在類中定義 `__eq__()` 方法來比較 `person` 物件的 `name` 和 `age` 屬性。最後,建立了 `person` 類的兩個例項,即 `p1` 和 `p2`,並使用 `==` 運算子進行比較。
class Person: def __init__(self, name, age): self.name = name self.age = age def __eq__(self, other): if isinstance(other, Person): return self.name == other.name and self.age == other.age return False p1 = Person("John", 30) p2 = Person("John", 30) if p1 == p2: print("p1 and p2 are equal")
輸出
p1 and p2 are equal
`is` 運算子
`is` 運算子檢查兩個物件的記憶體位置。如果兩個物件指向相同的記憶體位置,則 `is` 運算子返回 true,否則返回 false。`is` 運算子不用於檢查運算子值的相等性。
示例
在下面的示例中,我們建立了一個數組並將其賦值給另一個變數。藉助 `is` 運算子,我們可以檢查變數 a 和 b 是否引用相同的記憶體位置。
a = [1, 2, 3] b = a print(a is b)
輸出
True
`==` 運算子
`==` 運算子檢查被比較的運算數或物件的值是否相等。如果運算數具有相同的值,則返回 true,否則返回 false。`==` 運算子不檢查兩個物件的記憶體位置。
示例
在下面的示例中,建立了兩個包含相同值的陣列。`==` 運算子檢查兩個列表的相等性。
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True
輸出
True
結論
在本文中,我們討論了 Python 中 `__eq__`、`is` 和 `==` 運算子之間的區別。`__eq__` 方法比較相同類物件的數值相等性,而 `is` 運算子檢查被比較物件的記憶體位置。`==` 運算子檢查兩個物件的值是否相等。