比较int和float时,Python何时执行类型转换?


问题内容

为什么Python中返回True时,我比较intfloat具有相同价值的物品?

例如:

>>> 5*2 == 5.0*2.0
True

问题答案:

它不像类型转换那样简单。

10 == 10.0委托给参数的__eq__方法,(10).__eq__(10.0)首先尝试,然后(10.0).__eq__(10)在第一次调用返回时尝试NotImplemented。它不尝试转换类型。(从技术上讲,方法查找使用一个特殊的例程,该例程绕过实例__dict__条目和__getattribute__/或__getattr__重写,因此,它并不等同于自己调用方法。)

int.__eq__ 不知道如何处理浮点数:

>>> (10).__eq__(10.0)
NotImplemented

float.__eq__知道如何处理整数:

>>> (10.0).__eq__(10)
True

float.__eq__也不只是在内部执行转换。它具有100余行代码来处理浮点/整数比较,而不会出现未经检查的强制转换可能导致的舍入错误。(有些那可以简化如果C级比较例程没有还必须处理>>=<,和<=)。