Почему в Python она вычисляется следующим образом:Почему «False is False is False» означает «True»?
>>> False is False is False
True
но когда попытался с скобка ведет себя, как и ожидалось:
>>> (False is False) is False
False
Почему в Python она вычисляется следующим образом:Почему «False is False is False» означает «True»?
>>> False is False is False
True
но когда попытался с скобка ведет себя, как и ожидалось:
>>> (False is False) is False
False
СЦЕПЛЕНИЕ операторы, такие как a is b is c
эквивалентно a is b and b is c
.
Так первый пример False is False and False is False
, который вычисляет True and True
, который оценивает в True
Имея скобка приводит к результату одной оценки сравниваемых со следующей переменной (как вы говорите, что вы ожидаете), так (a is b) is c
сравнивает результат a is b
с c
.
Ваше выражение
False is False is False
рассматривается как
(False is False) and (False is False)
Таким образом, вы получите
True and True
и вычисляет True
.
Вы можете использовать этот тип цепочки с другими операторами.
1 < x < 10
Итак, '0> 2 - это ложь' возвращает' False' -> какое интуитивное поведение :) – abrasadera
>>> False is False is False
True
В этом случае каждый из False
пары оценивается. Оцениваются первые два False, если это True
, затем оценивается второй и третий False
и возвращают результат.
В этом случае False is False is False
эквивалентно and
результатов 2 команды False is False
Я думаю, что False is False is False
означает (False is False) and (False is False)
, но (False is False) is False
означает:
>>> (False is False) is False
False
>>> a_true = (False is False)
>>> a_true
True
>>> a_true is False
False
Таким образом, вы получите результат.
Цитирование Python official documentation,
Формально, если
a
,b
,c
, ...,y
,z
являются выражениями иop1
,op2
, ...,opN
являются операторы сравнения, тоa op1 b op2 c ... y opN z
эквивалентноa op1 b and b op2 c and ... y opN z
, за исключением того, что каждое выражение оценивается не более одного раза.
Так, False is False is False
оценивается как
(False is False) and (False is False)
Второе False is False
выражение использует второй False
в исходном выражении, которая эффективно переводит к
True and True
Именно поэтому первое выражение расценивается до True
.
Но во втором выражении последовательность оценки выглядит следующим образом.
(False is False) is False
Который на самом деле
True is False
Именно поэтому результат False
.
Thumbs up для цитирования официального источника. – SasQ
Интересно, что вы можете цепью произвольно много «является False», и результат по-прежнему верен. 'Eval (« is ».join ([« False »для i в диапазоне (n)]))' –
Потому что он работает для любая цепочка - как '1 <2 <3 <4' так:' 1 <2 и 2 <3 и 3 <4' – abrasadera
IMO, эта функция делает ее более похожей на простой английский. Например, если вы объясняете одноточие кому-то, вы можете указать, что «None is None is None». –