比较int和float时Python什么时候进行类型转换?

gau*_*av 8 python floating-point int python-3.x python-internals

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

例如:

>>> 5*2 == 5.0*2.0
True
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

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

10 == 10.0委托给参数的__eq__方法,(10).__eq__(10.0)首先尝试,然后(10.0).__eq__(10)如果第一次调用返回NotImplemented。它不会尝试转换类型。(从技术上讲,方法查找使用一个特殊的例程来绕过实例__dict__条目和__getattribute__/__getattr__覆盖,所以它并不完全等同于自己调用方法。)

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

>>> (10).__eq__(10.0)
NotImplemented
Run Code Online (Sandbox Code Playgroud)

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

>>> (10.0).__eq__(10)
True
Run Code Online (Sandbox Code Playgroud)

float.__eq__也不只是在内部执行演员表。它有100 多行代码来处理 float/int 比较,而没有未经检查的强制转换可能引入的舍入错误。(如果 C 级比较例程也不必处理、、 和>,那么其中一些可以简化。)>=<<=