Python比较魔术方法疑问:int与float比较的隐式类型转换问题
Python中int与float比较时的魔术方法调用逻辑
当你用123 < 150.6这种运算符比较不同类型对象时,Python的处理逻辑比直接调用单边魔术方法要复杂:
第一步:尝试调用左侧对象的
__lt__方法
首先Python会执行(123).__lt__(150.6),但int类型的__lt__只支持和同类型(int)的比较,遇到float时会返回NotImplemented——这不是错误,而是一个信号,告诉解释器“我处理不了这个比较,请试试另一边的对应方法”。第二步:尝试调用右侧对象的反向方法
当左侧__lt__返回NotImplemented后,Python会自动转向右侧对象的反向比较方法。对于<运算符来说,反向方法是__gt__(因为a < b等价于b > a),也就是执行(150.6).__gt__(123)。float类型的
__gt__方法支持接收int参数,它会先把int自动转换成float(也就是123→123.0),然后再比较150.6 > 123.0,结果为True,这就是你看到的最终输出。
你可以用下面的代码验证这个逻辑:
# 直接调用float的__gt__方法 print(getattr(150.6, '__gt__')(123)) # 输出: True
简单总结:运算符比较是双向的,当单边方法处理不了时,Python会自动尝试反向方法,这就是为什么直接调用__lt__和用<运算符结果不同的原因。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

