Вы неправильно понимаете, как работают булевы выражения; они не работают как английское предложение и предполагают, что вы говорите о том же сравнении для всех имен здесь. Вы ищете:
if x == 1 or y == 1 or z == 1:
x
и y
иным образом оценивали сами по себе (False
если 0
, True
в противном случае).
Вы можете сократить, что:
if 1 in (x, y, z):
или еще лучше:
if 1 in {x, y, z}:
используя set
воспользоваться тест членства постоянной стоимости (in
занимает фиксированное количество времени, независимо от левый операнд).
Когда вы используете or
, python видит каждую сторону оператора как отдельные выражения. Выражение x or y == 1
рассматривается как первый булевой тест для x
, тогда, если это False, проверяется выражение y == 1
.
Это связано с operator precedence. Оператор or
имеет более низкий приоритет, чем тест ==
, поэтому последний оценивается первый.
Однако, даже если бы это было не случай, а выражение x or y or z == 1
фактически интерпретируется как (x or y or z) == 1
вместо этого, это все равно не то, что вы ожидаете, что делать.
x or y or z
будет оценивать первый аргумент, который является «правдивым», например. а не False
, числовое 0 или пустое (см. boolean expressions для получения более подробной информации о том, что Python считает ложным в булевом контексте).
Так что для значений x = 2; y = 1; z = 0
, x or y or z
будет разрешено 2
, потому что это первое истинное значение в аргументах. Тогда 2 == 1
будет False
, хотя y == 1
будет True
.
То же самое относится к обратному; тестирование нескольких значений по одной переменной; x == 1 or 2 or 3
потерпел неудачу по тем же причинам. Используйте x == 1 or x == 2 or x == 3
или x in {1, 2, 3}
.
не должен быть вопрос "тест 'несколько' переменных против нескольких значений"? –
use '1' in (tuple) – DNinja21