Булева проверка коллекций в Python — почему вывод "2 True"

Булева проверка коллекций в Python — почему вывод "2 True"

@python_quiz

Разберем этот квиз

Код из квиза:

python

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

Дальше поясню, почему так получается.

Как работает выражение if x в списковом включении

В конструкции [x for x in data if x] элементы x фильтруются по их булевому значению — остаются только те, для которых bool(x) истинно. Важно понимать правило для коллекций и специальных значений:

  • Пустые коллекции/последовательности ([], (), {}, set(), "") — считаются ложными.
  • None — ложен.
  • Непустые коллекции — считаются истинными, даже если внутри них находятся "ложные" элементы (например, 0 или False).

Проход по элементам списка data

Разберём каждый элемент:

  1. [] — пустой список → ложен → отбрасывается.
  2. [0] — список с одним элементом 0. Сам список непустой → истинный → остаётся.
  3. None — ложен → отбрасывается.
  4. [False] — список с одним элементом False. Но список непустой → истинный → остаётся.
  5. '' — пустая строка → ложна → отбрасывается.

Итого в filtered попадут два элемента: [0] и [False]. Значит len(filtered) — 2.

Последний элемент filtered[-1] — это [False]. Это непустой список, значит bool(filtered[-1]) — True.

Демонстрация и дополнительные проверки

Наглядный пример с дополнительными print:

python

Вывод подтвердит: filtered = [[0], [False]] и окончательный print — 2 True.

Распространённая ошибка и пояснение

Многие ожидают, что [0] или [False] будут считаться ложными, потому что 0 и False сами по себе ложны. Но важно отличать значение элемента и булевость контейнера:

  • bool(0) → False
  • bool([0]) → True

Контейнер считается по тому, пустой он или нет, а не по булевым значениям его элементов.

Итог

Ключевая мысль: оператор if в фильтрации проверяет булевое значение самого элемента (контейнера), а не значений внутри него. Непустые списки всегда истинны, даже если внутри них лежат 0 или False.

Report Page