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






Вот как это должно работать. 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
Вы всегда можете так
bool(...), если вам абсолютно необходим бул.