为什么python reduce()与`None`元素的行为不同?

时间:2012-03-14 11:38:56

标签: python functional-programming

我不理解similar question.

的答案

很明显,这应该返回True

l = [1,1,1]
reduce(lambda x,y: x== y, l)

但是,您如何解释此回归False(当None==NoneTrue时)

l = [None,None,None]
reduce(lambda x,y: x== y, l)

4 个答案:

答案 0 :(得分:8)

因为

1 == True # 1 == (1 == 1)

True,但是

None == True # None == (None == None)

FalseNone == 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 == NoneTrue)的结果,然后是True == NoneFalse),然后直到结束,{{1 (False == None)。

Reduce将最后一次计算的结果与序列中的下一个元素进行比较。

答案 2 :(得分:1)

None没什么不同,实际上,第一种情况下reduce内发生的事情是

  • 1与1(== True
  • 进行比较
  • True与1(== True
  • 进行比较

在第二种情况下,它是

  • NoneNone(== True
  • 相比较
  • TrueNone(== 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等单身人士的比较应始终使用isis not永远不要使用相等运算符。” - [PEP8]