Python: оператор `и` не возвращает логическое значение

В Python пустой список считается значением Falsey.

Поэтому вот как все должно работать:

>>> [] and False
False

Но на самом деле python возвращает пустой список.

>>> [] and False
[]

Это задумано или баг?

Вы всегда можете так bool(...), если вам абсолютно необходим бул.

tadman 02.02.2023 22:20

@tadman: И в наши дни это даже не так уж и медленно! У меня был какой-то игрушечный код, который я написал некоторое время назад, где функция заканчивалась на return bool(somelist), потому что вызывающей стороне нужно было только знать, пусто ли list или нет, им не нужно содержимое. Этот bool вызов замедлил код примерно на 30% по сравнению с return somelist (при этом вызывающая сторона оценивала его логическую неявность с помощью if funccall():). В настоящее время они оптимизировали глобальный и встроенный поиск и использовали векторный вызов, чтобы значительно сократить накладные расходы на вызов bool, но это все же более высокие накладные расходы, чем неявное логическое тестирование.

ShadowRanger 02.02.2023 22:28

В 99,99% случаев, если вы думаете, что в Python (или любом интерпретаторе/компиляторе) есть ошибка, это не так, особенно для основных операций.

Mark Tolonen 02.02.2023 22:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
102
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот как это должно работать. and вернет правый операнд только в том случае, если левый операнд верен. Поскольку [] ложно, and возвращает левый операнд.

Ответ принят как подходящий

Это предназначено. И and, и or определены для возврата последней оцененной вещи (на основе короткого замыкания), а не на самом деле True или False. Для and это означает, что он возвращает первое ложное значение, если оно есть, и последнее значение (независимо от истинности), если все остальные истинны.

Это было особенно полезно до того, как было добавлено условное выражение, так как оно позволяло вам делать некоторые почти эквивалентные хаки, например. перед условным выражением:

b if a else c

может быть записано как:

a and b or c

и, предполагая, что b само по себе является чем-то правдивым, оно будет вести себя эквивалентно (в условном выражении не было этого ограничения, и оно было более ясным в отношении намерения, поэтому оно было добавлено). Даже сегодня эта функция иногда полезна для замены всех ложных значений некоторыми более конкретно типизированными значениями по умолчанию, например. когда lst может быть передано как None или list, вы можете убедиться, что это list с помощью:

lst = lst or []

дешево заменить None (и любую другую фальшивую вещь) на новый пустой list.

Это совершенно ожидаемое поведение. Чтобы понять это, вам нужно знать, как работают логические операторы (and, or, not). Из документации Boolean Operations:

Выражение x and y сначала оценивает x; если x ложно, возвращается его значение; в противном случае оценивается y и возвращается результирующее значение.

Теперь давайте рассмотрим ваш пример: [] and False. Здесь, поскольку [] является ложным, его значение возвращается оператором, который является [].

Вышеприведенная документация Python явно упоминает:

Примечание. Ни and, ни or не ограничивают значение и тип, которые они возвращают, False и True, а скорее возвращают последний оцененный аргумент.

Однако, если вам нужно возвращаемое значение как логическое, вы можете явно привести значение к типу True или False, используя функцию bool().

Например, в вашем случае он вернется как False:

>>> bool([] and False)
False

Другие вопросы по теме