很明显,这应该返回True
l = [1,1,1]
reduce(lambda x,y: x== y, l)
但是,您如何解释此回归False
(当None==None
为True
时)
l = [None,None,None]
reduce(lambda x,y: x== y, l)
答案 0 :(得分:8)
因为
1 == True # 1 == (1 == 1)
是True
,但是
None == True # None == (None == None)
是False
(None == False
也是False
,所以一旦你False
,它就会False
}。
这就是reduce
的工作原理:它将前一个评估的每个元素和结果传递给回调。通过它,将一系列值减少为一个值。
答案 1 :(得分:4)
请考虑以下事项:
In [214]: l = [None,None,None]
In [215]: reduce(lambda x,y: x== y, l)
Out[215]: False
In [216]: from functional import scanl
In [217]: scanl(lambda x,y: x== y, None, l)
Out[217]: <generator object _scanl at 0x0000000005770D38>
In [218]: list(scanl(lambda x,y: x== y, None, l))
Out[218]: [None, True, False, False]
scanl
显示从初始元素开始的中间结果。发生的事情是,首先返回初始值,然后是None == None
(True
)的结果,然后是True == None
(False
),然后直到结束,{{1 (False == None
)。
Reduce将最后一次计算的结果与序列中的下一个元素进行比较。
答案 2 :(得分:1)
与None
没什么不同,实际上,第一种情况下reduce
内发生的事情是
True
)True
与1(== True
)在第二种情况下,它是
None
与None
(== True
)True
与None
(== False
)有趣的例子是:
>> from operator import eq
>> reduce(eq, [False, False, False])
False
>> reduce(eq, [False, False, False, False])
True
答案 3 :(得分:0)
您的第二个示例返回False
,因为第一次None == None
提供了True
,但True == None
提供了False
。
查看reduce
doc,看看它是如何运作的。
另请注意,“与None
等单身人士的比较应始终使用is
或is not
,永远不要使用相等运算符。” - [PEP8]