Я не понимаю, как я получаю этот вывод (в цепочке операторов)

1

Насколько я знаю, оператор in python не может быть привязан или, по крайней мере, я не мог найти никакой информации об этом, вот моя проблема

Вот код

arr = [1, True, 'a', 2]
print('a' in arr in arr) // prints False
print(('a' in arr) in arr) // prints True

То, что я не понимаю, является первой печатью, которую я знаю во второй, первая возвращает True, а затем проверяет, находится ли True в arr, но как насчет первого? Проверяет ли он, что "a" находится в arr, а затем, если arr находится в arr?

Теги:

1 ответ

3
Лучший ответ

Посылка неверна; in операторе может быть цепь. См. Сравнение в документах:

comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

Таким образом, как и при любом другом сопоставленном сравнении, a in b in c эквивалентно (a in b) and (b in c) (за исключением того, что b оценивается только один раз.

Причина 'a' in arr in arr is false заключается в том, что arr in arr является ложным. Единственное время x in x истинно, если x - тип, который выполняет сравнения подстрок для __contains__ (например, str или bytes), или если это контейнер, который фактически содержит себя (например, lst = []; lst.append(lst)).

  • 0
    Я знал об операторе сравнения цепочки, но я не знаю, почему я не думал, что оператор в был одним из них, но теперь все это имеет смысл, большое спасибо
  • 1
    @AntonKahwaji Ну, это не совсем то, чего ты естественным образом достигнешь… на самом деле, я даже не думаю, что это было добавлено намеренно; это просто бесплатно, если вы собираетесь заставить x <= y < z работать, если вы не сделаете все возможное, чтобы сделать его незаконным. (И это сделало бы реализацию и правила обучения людей немного более сложными. Они даже не запретили x < y > z , что более бесполезно и запутанно, чем x in y in z .)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню