Булева проверка коллекций в Python — почему вывод "2 True"
@python_quizРазберем этот квиз
Код из квиза:

Краткий итог: программа напечатает

Дальше поясню, почему так получается.
Как работает выражение if x в списковом включении
В конструкции [x for x in data if x] элементы x фильтруются по их булевому значению — остаются только те, для которых bool(x) истинно. Важно понимать правило для коллекций и специальных значений:
- Пустые коллекции/последовательности ([], (), {}, set(), "") — считаются ложными.
- None — ложен.
- Непустые коллекции — считаются истинными, даже если внутри них находятся "ложные" элементы (например, 0 или False).
Проход по элементам списка data
Разберём каждый элемент:
[]— пустой список → ложен → отбрасывается.[0]— список с одним элементом 0. Сам список непустой → истинный → остаётся.None— ложен → отбрасывается.[False]— список с одним элементом False. Но список непустой → истинный → остаётся.''— пустая строка → ложна → отбрасывается.
Итого в filtered попадут два элемента: [0] и [False]. Значит len(filtered) — 2.
Последний элемент filtered[-1] — это [False]. Это непустой список, значит bool(filtered[-1]) — True.
Демонстрация и дополнительные проверки
Наглядный пример с дополнительными print:

Вывод подтвердит: filtered = [[0], [False]] и окончательный print — 2 True.
Распространённая ошибка и пояснение
Многие ожидают, что [0] или [False] будут считаться ложными, потому что 0 и False сами по себе ложны. Но важно отличать значение элемента и булевость контейнера:
- bool(0) → False
- bool([0]) → True
Контейнер считается по тому, пустой он или нет, а не по булевым значениям его элементов.
Итог
Ключевая мысль: оператор if в фильтрации проверяет булевое значение самого элемента (контейнера), а не значений внутри него. Непустые списки всегда истинны, даже если внутри них лежат 0 или False.