Если список проверок операторов содержит, возвращается true, если он не должен
У меня есть список, который содержит значения:
['1', '3', '4', '4']
У меня есть оператор if, который проверяет, содержатся ли значения в списке, затем выводит оператор:
if "1" and "2" and "3" in columns:
print "1, 2 and 3"
Учитывая, что список не содержит значения "2", он не должен печатать инструкцию, но это:
Вывод:
1, 2 and 3
Может кто-нибудь объяснить, почему это так? Это как Python читает список, который делает это?
Ответы
Ответ 1
Он оценивается в порядке приоритет оператора:
if "1" and "2" and ("3" in columns):
Развертывается на:
if "1" and "2" and True:
Что затем оценивает ("1" and "2")
, оставляя нас с:
if "2" and True
Наконец:
if True:
Вместо этого вы можете проверить, является ли строка set
для строк подмножеством columns
:
if {"1", "2", "3"}.issubset(columns):
print "1, 2 and 3"
Ответ 2
Здесь есть два общих правила, чтобы понять, что происходит:
При оценке выражения "1" and "2" and "3" in columns
порядок приоритета оператора оценивается как "1" and "2" and ("3" in columns)
. Таким образом, он расширяется до "1" and "2" and True
, так как "3"
действительно является элементом columns
(обратите внимание, что одиночные или двойные кавычки взаимозаменяемы для строк python).
Операторы в той же группе полей слева направо
Поскольку у нас есть два оператора с одинаковым приоритетом, тогда оценка ("1" and "2") and True
.
Для and
документация для состояний логических операций:
Выражение x и y сначала оценивает x; если x является ложным, его значение равно вернулся; в противном случае y вычисляется, и полученное значение равно вернулся.
Таким образом, ("1" and "2") and True
оценивается как "2" and True
, который затем оценивается как True
. Поэтому тело if
всегда выполняется.