Python: False или None против None или False

In [20]: print None or False
-------> print(None or False)
False

In [21]: print False or None
-------> print(False or None)
None

это поведение смущает меня. Может кто-нибудь объяснить мне, почему это происходит? Я ожидал, что они будут вести себя одинаково.

6 ответов


выражение x or y оценивает в x если x - Это правда, или y Если x является false.

обратите внимание, что" true "и" false "в приведенном выше предложении говорят о" правдивости", а не о фиксированных значениях True и False. Что-то, что "истинно", делает if утверждение успешно; что-то" ложное " делает его неудачным. "ложные" значения:False, None, 0 и [] (пустой список).


оператор "или" возвращает стоимостью его первого операнда, если это значение истинно в Пифоническом булевом смысле (он же его "истинность"), в противном случае он возвращает стоимостью его второго операнда, что-либо. См. подраздел под названием логические операции в разделе выражения на текущей документации.

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


тесно связанные темы: в Python or и and короткое замыкание. В логическом or операция, если какой-либо аргумент истинен, то все это будет истинно, и больше ничего не нужно оценивать; Python быстро возвращает это значение "true". Если он заканчивается, и ничего не было true, он возвращает последний аргумент, который он обработал, который будет "false" значение.

and наоборот, если он видит какие-либо ложные значения, он быстро выйдет с этим " false" value, или если он проходит через все это, возвращает окончательное значение "true".

>>> 1 or 2 # first value TRUE, second value doesn't matter
1
>>> 1 and 2 # first value TRUE, second value might matter
2
>>> 0 or 0.0 # first value FALSE, second value might matter
0.0
>>> 0 and 0.0 # first value FALSE, second value doesn't matter
0

вы должны понять, что None, False и True - все синглтоны.

например, if foo is not None означает, что foo имеет некоторое значение, отличное от None. Это работает так же, как просто if foo что в принципе if foo == True.

и not None и True работа таким же образом. Кроме того,None и False работают одинаково.

>>> foo = not None
>>> bool(foo)
True
>>> foo = 5  # Giving an arbitrary value here
>>> bool(foo)
True

>>> foo = None
>>> bool(foo)
False
>>> foo = 5  # Giving an arbitrary value here
>>> bool(foo)
True

важно понимать и осознавать, Когда кодирование заключается в том, что при сравнении двух вещей, None должен is, а True и False нужно ==. Избегайте if foo == None и не только if foo is None и не if foo != None и не только if foo is not None. В случае if foo is not None, просто if foo. В случае if foo is None, просто if not foo.

Примечание: True в основном 1 и False в основном 0. В старые времена Python у нас было только 1 для значения true и у нас было 0 для значения false. Это более понятно и по-человечески сказать True вместо 1 и более понятным и дружественным к человеку сказать False вместо 0.


с логической точки зрения они оба ведут себя одинаково, оба возвращают значение, которое оценивается как false.

or просто "повторно использует" значения, которые ему заданы, возвращая левый, если это было верно, и правый в противном случае.


Condition1 or Condition2

если Condition1 равно False, то evalute и возвращает Condition2. Никто evalutes значение false.