比较int和float时,Python何时执行类型转换?
问题内容:
为什么Python中返回True
时,我比较int
和float
具有相同价值的物品?
例如:
>>> 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级比较例程没有还必须处理>
,>=
,<
,和<=
)。