Python lambda函数中的float身份比较

时间:2018-03-23 10:47:47

标签: python lambda floating-point comparison identity

为什么Python的lambdas会出现以下情况(在Python 2和3中都有)?

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

1 个答案:

答案 0 :(得分:2)

最常见的Python实现将许多小整数存储为"常量"或者"永久性"预分配数组中的对象:请参阅documentation。因此,可以使用is运算符将这些数字统一为相同的对象。浮动没有这样做。

如果要使用等于运算符==来比较数字,那么对于整数和浮点数,您将获得相同的行为。

请注意,0是一个整数,0.0是一个浮点数。

如果要使用更大的整数而不是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是一个浮点数,对于浮点数,内部没有任何预分配,就像有限范围的整数一样,所以这实际上是与上述情况相同。

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

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