为什么 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/