Python中'_eq_' vs 'is' vs '=='的区别

2025年1月5日 | 阅读6分钟

对象检查是 Python 编程的一个重要部分,使开发人员能够评估对象的相等性和身份。在 Python 中,对象是万物的中心——变量、数据结构、函数等等都是对象。因此,理解对象是如何被比较和评估的对于编写高效和正确的代码至关重要。无论是检查值、验证对象身份还是定义自定义的相等行为,对象检查在软件开发的各个方面都起着至关重要的作用。

介绍 eq()、is 和 == 用于比较任务

在 Python 中,有三种基本机制用于比较任务:_eq_()、is 和 ==。每种机制都有特定的用途,并且工作方式不同。

  • _eq_():此方法用于为用户定义的类定义自定义相等行为。它允许开发人员指定类的实例如何被比较以判断相等性。
  • is:is 运算符用于比较对象身份,确定两个对象是否引用相同的内存地址。
  • ==:== 运算符用于值比较,比较对象的内容以根据其定义的相等规则检查它们是否相等。

理解这些机制之间的区别并知道何时使用它们对于编写清晰高效的 Python 代码至关重要。

eq() 方法:自定义相等比较

_eq_() 方法是 Python 类中的一种特殊方法,它允许开发人员定义自定义的相等行为。通过覆盖此方法,开发人员可以指定类的实例如何被比较以判断相等性。实现 _eq_() 的语法很简单,并且它提供了灵活性,可以根据类的需求定义自定义的比较逻辑。让我们通过一些示例来深入了解语法并更好地理解其应用。

语法

示例

输出

 
True (equal)
False (not equal)   

说明

在此示例中,我们定义了一个 Person 类,并自定义了 _eq_() 方法,以便根据姓名和年龄属性比较两个实例。当我们比较 person1 和 person2 时,它们都有相同的姓名(“Alice”)和年龄(30),因此自定义相等性比较返回 True,表明它们相等。但是,当我们比较 person1 和 person3 时,它们的姓名或年龄不同,导致 False 评估,表明它们不相等。

示例 2

输出

 
True (equal)
False (not equal)   

说明

在此示例中,我们定义了一个 Product 类,并自定义了 _eq_() 方法,以便根据名称和价格属性比较两个实例。当我们比较 product1 和 product2 时,它们都有相同的名称(“PC”)和价格(1000),因此自定义相等性比较返回 True,表明它们相等。但是,当我们比较 product1 和 product3 时,它们的名称或价格不同,导致 False 评估,表明它们不相等。

is 运算符:对象身份比较

在 Python 中,is 运算符用于对象身份比较。它检查两个对象是否引用相同的内存地址,表明它们是同一个对象。与比较对象值的 == 运算符不同,is 运算符比较对象的身份。这种区别非常重要,尤其是在处理可变对象和身份检查时。让我们深入了解 is 运算符的使用,以更深入地理解对象身份比较。

Python 中的 is 运算符易于使用。如果两个变量引用同一个对象,它将评估为 True;否则,它将评估为 False。这是一个展示 is 运算符用法的简单示例

示例

输出

 
True
False (different objects)   

说明

在此示例中,我们有一个列表 a,包含 [1, 2, 3]。然后,我们将 a 赋值给 b,使 b 引用与 a 相同的列表对象。因此,当我们使用 is 运算符比较 a 和 b 时,它的评估结果为 True,表明它们在内存中引用同一个对象。但是,当我们创建一个具有与 a 相同元素的列表 c 时,它是内存中的一个不同对象。因此,当我们使用 is 比较 a 和 c 时,它的评估结果为 False,表明它们是不同的对象。

示例 2

输出

 
True
False (different objects)   

说明

在此示例中,a 和 b 引用同一个列表对象,因此 is 运算符评估为 True。但是,当我们使用切片创建一个 a 的浅拷贝 c 时,c 成为一个不同的列表对象,尽管它包含与 a 相同的元素。因此,当我们使用 is 比较 a 和 c 时,它的评估结果为 False,表明它们是不同的对象。

== 运算符:值比较

与检查对象身份的 is 运算符不同,== 运算符用于值比较。它比较对象的内容,以根据其定义的相等规则确定它们是否相等。对于整数、字符串和列表等内置类型,== 会比较对象的值。这是一个展示 == 运算符用法的示例

示例

输出

 
True (same width and height)
False (different width or height)   

说明

在此示例中,我们定义了一个 Rectangle 类来表示具有宽度和高度属性的矩形。由于我们没有定义自定义的 _eq_() 方法,== 运算符通过比较实例的值来执行值比较。当我们比较 rect1 和 rect2 时,它们都具有相同的宽度(10)和高度(20),因此值比较返回 True,表明它们相等。但是,当我们比较 rect1 和 rect3 时,它们的宽度或高度不同,导致 False 评估,表明它们不相等。

示例 2

输出

 
True (same coordinates)
False (different coordinates)   

说明

在此示例中,Point 类表示具有 x 和 y 坐标的 2D 平面上的点。由于我们没有定义自定义的 _eq_() 方法,== 运算符通过比较实例的属性来执行值比较。当我们比较 point1 和 point2 时,它们都具有相同的 x (1) 和 y (2) 坐标,因此值比较返回 True,表明它们相等。但是,当我们比较 point1 和 point3 时,它们的坐标不同,导致 False 评估,表明它们不相等。