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

更新于:2023年4月17日

6K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告