首页 > 解决方案 > Python在比较int和float时什么时候进行类型转换?

问题描述

True当我比较具有相同值的对象int时,为什么 Python 会返回?float

例如:

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

标签: pythonpython-3.xfloating-pointintpython-internals

解决方案


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

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 级比较例程也不必处理>>=<和,则其中一些可以简化<=。)


推荐阅读