当我比较具有相同值的True
和int
对象时,为什么Python返回float
?
例如:
>>> 5*2 == 5.0*2.0
>>> True
答案 0 :(得分:2)
不同类型的对象(不同的数字类型除外)永远不会比较相等。
并且:
Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“更窄”类型的操作数将扩展为另一个,即整数比浮点数窄,比浮点数窄。 。 混合类型数字之间的比较使用相同的规则。
https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
比较逻辑由每种类型的__eq__
method实现。标准数字类型以相互支持比较(和算术运算)的方式实现。 Python作为一种语言,永远不会进行隐式类型转换(例如Javascript的==
运算符会进行隐式类型转换)。
答案 1 :(得分:1)
10 == 10.0
转换为对(10).__eq__(10.0)
的呼叫(或更正式的说法是int.__eq__(10, 10.0)
)。 int.__eq__
的实现可以处理与其他类型的比较,但是在语言级别没有类型转换。
答案 2 :(得分:1)
简单的答案是,语言是通过这种方式设计的。以下是支持此内容的文档摘录:
内置数字类型(Numeric Types — int,float,complex)和标准库类型分数(分数和小数)的数量可以在其类型之内和之间进行比较,但不能使用复数支持订单比较。
换句话说,我们希望具有相同值的不同数字类型相等。
特殊情况还不足以打破规则。
尽管实用性胜过纯度。
除了在大多数情况下使生活变得困难之外,使数字类型不具有可比性还有什么好处?
答案 3 :(得分:1)
您可以查看the source code的CPython实现。
此函数之前有此注释,解释了如何尝试进行转换:
/* Comparison is pretty much a nightmare. When comparing float to float, * we do it as straightforwardly (and long-windedly) as conceivable, so * that, e.g., Python x == y delivers the same result as the platform * C x == y when x and/or y is a NaN. * When mixing float with an integer type, there's no good *uniform* approach. * Converting the double to an integer obviously doesn't work, since we * may lose info from fractional bits. Converting the integer to a double * also has two failure modes: (1) an int may trigger overflow (too * large to fit in the dynamic range of a C double); (2) even a C long may have * more bits than fit in a C double (e.g., on a 64-bit box long may have * 63 bits of precision, but a C double probably has only 53), and then * we can falsely claim equality when low-order integer bits are lost by * coercion to double. So this part is painful too. */
不能保证其他实现遵循相同的逻辑。
答案 4 :(得分:0)
Python完全支持混合算术:当使用二进制算术时 运算符具有不同数值类型的操作数,带有 “较窄”类型扩展为其他类型,即普通整数 小于长整数小于浮点 比复杂要窄。混合类型使用次数之间的比较 相同的规则。
由此5 * 2扩大到10.0等于10.0 如果要比较混合数据类型,则将基于具有较长范围的数据类型的基础来考虑结果,因此在您的情况下,浮点范围大于int 浮动最大数量可以是-> 1.7976931348623157e + 308 int最大数可以是-> 9223372036854775807
谢谢
答案 5 :(得分:-2)
==运算符仅比较值,而不比较类型。您可以使用'is'关键字来达到与其他语言中使用===相同的效果。例如
5 is 5.0
返回 错误
答案 6 :(得分:-4)
==
是比较运算符
您实际上是在询问解释器,您的表达式的两边是否相等。
换句话说,您要它返回布尔值,而不是转换数据类型。如果要转换数据类型,则必须在代码中进行隐式转换。