【Python】相等性比较运算(==, is)的学习笔记
1. 相等性比较运算:== & is
Python中有两种比较运算符==
和is
;
==
和 is
的主要区别在于它们比较的对象属性不同:
-
==
运算符:- 比较对象的值或内容是否相等。
- 调用对象的
__eq__()
方法来进行比较。 - 可以被重载(在自定义类中重新定义),以实现特定的相等性比较逻辑。
-
is
运算符:- 比较对象的身份(identity),即检查两个引用是否指向内存中的同一个对象。
- 比较对象的 ID,可以通过
id()
函数获取。 - 不能被重载。
2. ==
:用于比较数值的相等性
==
运算符的比较过程实际上相当复杂,涉及多个步骤和特殊情况;
2.1 调用 __eq__()
方法:
- 当使用
a == b
时,Python 首先检查左侧对象是否有__eq__()
方法;如果有,它会调用a.__eq__(b)
,将右侧对象作为参数传入; - 如果
a.__eq__(b)
返回NotImplemented
,说明左侧对象没有__eq__()
方法;Python 会检查右侧对象是否有__eq__()
方法; - Python 会尝试
b.__eq__(a)
; - 如果两者都没有自定义的
__eq__()
方法,Python会进行类型检查;
2.2 类型检查对比
2.3.1 如果类型相同,Python 会比较对象的id(等同于使用 is
运算符)
2.3.2. 如果类型不同,需要查看是否是内置类型
- 数值类型比较:对于数字、字符串等内置类型,Python 会比较它们的值;
- 复合对象比较:对于复合对象(如列表、元组、字典),Python 会递归地比较它们的元素;
- 特殊情况处理:某些类型(如
float('nan')
)有特殊的比较规则; - 其它情况:类型不同,通常直接返回 False。