если а или б объяснение - PullRequest
       4

если а или б объяснение

0 голосов
/ 13 декабря 2018
a = None

b = 'Test'

if a is None or b is None:
    print('Test')

эта версия, очевидно, работает, но:

if (a or b) is None:
   print('Test')

Ожидаемый будет тот же результат, но он оценивается как False, почему?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

В Python оператор or не просто возвращает True или False, он возвращает первый из своих аргументов, который "правдивый" .

В вашемкод, следующее происходит при оценке (a or b) is None:

  1. None ложно, а a равно None, поэтому a or b возвращает b.
  2. b не None.
  3. (a or b) is None разрешается в False.
0 голосов
/ 13 декабря 2018

Если вы хотите быть очень кратким, вы можете использовать следующую конструкцию:

if None in (a, b):
    print('Test')

Обратите внимание, что хотя это будет работать в большинстве случаев, выражение не совсем эквивалентно a is None or b is Noneа точнее a == None or b == None.См. объяснение того, почему это не одно и то же.

0 голосов
/ 13 декабря 2018

Приоритет оператора и правила вычисления логических выражений работают немного по-другому в Python.Это не делает то, что вы себе представляете:

(a or b) is None

Вышеприведенное условие спрашивает, равен ли результат оценки (a or b) None, и никогда не будет None с текущими значениями a и b;a or b вернет 'Test' (значение b), потому что a равно None.Если вы хотите проверить, является ли одно из двух значений None, допустим только первый синтаксис:

a is None or b is None

Просто, чтобы быть понятным, в Python x or y вернет значение первого неложное выражение, а None, [], {}, '', 0 и False считаются ложными.Если вы хотите немного сократить выражение, это эквивалентно первой версии вашего кода:

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