(1 != (None is None))
Прежде, чем сравнить 1 и второе выражение, python вычислит выражение. то-есть:
1. (None is None) = True
2. 1 != True
https://docs.python.org/release/3.0.1/reference/da...
The Boolean type is a subtype of the integer type, and Boolean values behave like the values 0 and 1, respectively, in almost all contexts, the exception being that when converted to a string, the strings "False" or "True" are returned, respectively.
В python3 type boolean является подтипом integer и, соответственно, значения 0 и 1 равны (но не идентичны) False и True соответственно
(1 != None) is None
Сначала, python должен вычислить все значения в операции сравнения (не совсем сравнения, но об этом позже). 1 != None - это верное выражение (True). Соответственно, на втором шаге:
True is None
is - оператор идентичности. То есть, он сравнивает не только значение, но и тип данных. Например, предыдущая задача:
1 is True
Out: False
соответственно, True: boolean, None: None Типы разные, значит идентичности нет. False
(1 != None is None)
В этом примере используется цепочка сравнений (chaining). Запись эквивалентна
1 != None and None is None
Out: True
если необходимо выполнить пошаговое сравнение, то стоит записать
(1 != None) is None
Приоритет у != и is должен быть одинаковый, просто в Python есть много магии, и при указанном выше выражении срабатывает преобразование, указанное выше.