Глядя на разборку (коды байтов), очевидно, почему 0 < 0 == 0
- False
.
Вот анализ этого выражения:
>>>import dis
>>>def f():
... 0 < 0 == 0
>>>dis.dis(f)
2 0 LOAD_CONST 1 (0)
3 LOAD_CONST 1 (0)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 0 (<)
11 JUMP_IF_FALSE_OR_POP 23
14 LOAD_CONST 1 (0)
17 COMPARE_OP 2 (==)
20 JUMP_FORWARD 2 (to 25)
>> 23 ROT_TWO
24 POP_TOP
>> 25 POP_TOP
26 LOAD_CONST 0 (None)
29 RETURN_VALUE
Notice Строки 0-8: Эти строки проверяют, есть ли 0 < 0
, который, очевидно, возвращает False
в стек python.
Теперь обратите внимание на строку 11: JUMP_IF_FALSE_OR_POP 23
Это означает, что если 0 < 0
возвращает False
переход к строке 23.
Теперь 0 < 0
- False
, поэтому выполняется переход, который оставляет стек с False
, который является возвращаемым значением для всего выражения 0 < 0 == 0
, хотя часть == 0
даже не проверена.
Итак, в заключение, ответ подобен сказанному в других ответах на этот вопрос. 0 < 0 == 0
имеет особое значение. Компилятор оценивает это на два термина: 0 < 0
и 0 == 0
. Как и с любыми сложными булевыми выражениями с and
между ними, если первое не удается, второе не проверяется даже.
Надеется, что это немного просветит, и я очень надеюсь, что метод I используемый для анализа этого неожиданного поведения, побудит других попробовать их в будущем.
Обновите свой сертификат разработки iOS, загрузите и откройте его и используйте для следующего распространения. Также проверьте срок действия сертификата распространения iOS.