Если список проверок операторов содержит, возвращается 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 всегда выполняется.