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` 运算符检查被比较对象的内存位置。`==` 运算符检查两个对象的值是否相等。