为什么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
答案 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
。