Почему python limit () ведет себя по-разному с элементом `None`? - PullRequest
2 голосов
/ 14 марта 2012

Я не понимаю ответы на подобный вопрос.

Понятно, что это должно вернуть 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)

Ответы [ 4 ]

8 голосов
/ 14 марта 2012

Потому что

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

равно True, но

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

равно FalseNone == False равно False, поэтому, как только вы получите False, оно останется False).

Вот как работает reduce: он передает каждый элемент и результат предыдущей оценки обратному вызову. И тем самым уменьшает последовательность значений до одного значения.

4 голосов
/ 14 марта 2012

Обратите внимание на следующее:

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), затем до конца False == None (False).

Функция Reduce сравнивает результат последнего вычисления со следующим элементом в последовательности.

1 голос
/ 14 марта 2012

Это не отличается от None, на самом деле, то, что происходит внутри reduce, в первом случае -

  • 1 по сравнению с 1 (== 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
0 голосов
/ 14 марта 2012

Ваш второй пример возвращает False, потому что в первый раз None == None дает True, а True == None дает False.

Взгляните на reduce документ , чтобы увидеть, как он работает.

Также обратите внимание, что «сравнение с синглетами, такими как None, всегда должно выполняться с is или is not, , а не с операторами равенства ». - [PEP8]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...