python - Python lambda 函数中的 float 恒等比较

标签 python lambda floating-point comparison identity

为什么 Python 的 lambda 表达式(在 Python 2 和 3 中)会发生以下情况?

>>> zero = lambda n: n is 0
>>> zero(0)
True
>>> zero = lambda n: n is 0.0
>>> zero(0.0)
False

最佳答案

最常见的 Python 实现将许多小整数存储为预分配数组中的“常量”或“永久”对象:请参阅 documentation 。因此,可以使用 is 运算符将这些数字识别为相同的对象。这不适用于 float 。

如果您使用相等运算符 == 比较数字,您会得到整数和 float 相同的行为。

请注意,0 是整数,0.0 是 float 。

如果您要使用更大的整数而不是 0(例如,更改 lambda 来测试 n is 5000,并插入 5000 到函数中),它会再次返回 False,因为两个 5000 数字在内部是不同的对象。

<小时/>

为清楚起见,一些示例:

>>> zero = lambda n: n is 0
>>> zero(0)
True

is 在这里返回 True,因为 0 的两个实例在内部实际上是同一个对象(这就是 is > 检查)。

>>> zero = lambda n: n == 0
>>> zero(0)
True

== 这次返回 True 是因为两个数字相等,而不一定是因为它们内部是相同的对象。

>>> zero = lambda n: n is 5000
>>> zero(5000)
False

这会返回 False,因为 5000 数字太大,它不再适合内部预先分配的数字范围。

>>> zero = lambda n: n is 0.0
>>> zero(0.0)
False

这会再次返回 False,因为 0.0 是一个 float ,对于 float ,没有像有限范围的整数那样在内部进行任何预分配,因此这实际上与上面的情况完全相同。

>>> zero = lambda n: n == 0.0
>>> zero(0.0)
True

使用 == 而不是 is 会再次比较数字而不是内部对象,所以现在我们得到 True

关于python - Python lambda 函数中的 float 恒等比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49447925/

相关文章:

c++ - Lambda 适用于最新的 Visual Studio,但在其他地方不起作用

python - 将 float 转换为整数时的 Pandas 四舍五入

python - 改进 Canny 边缘检测

python 线程 - 请解释一下

Python练习说明

java - 将具有 lambda 的类映射到默认值

python - 自动复制网页到剪贴板

c++ - 如果 lambda 在运行时被移动/销毁会怎样?

assembly - 将 FASM 中的 80 位 float 与给定精度进行比较

python - 按对象或两个 float 索引 python dict