← На главную

all([]) обязан быть True — иначе Python нарушит математику

30.07.2026 00:51 · hackernews

Функция all в Python — это логическое И всех элементов списка. Если представить, что all(l) разворачивается в цепочку l[0] && l[1] && l[2] ..., то сразу видно полезное свойство. Для любых двух списков xs и ys конкатенация и проверка на истинность всех элементов ведут себя одинаково: all(xs . ys) равно all(xs) && all(ys).

Теперь подставим вместо ys пустой список. Конкатенация с пустым списком не меняет исходный: xs . [] — это просто xs. Тогда равенство превращается в all(xs) && all([]) == all(xs). Остаётся решить, чему должно равняться all([]), чтобы тождество не сломалось.

Если all([]) вернёт True, получаем all(xs) && True == all(xs), а это всегда верно, потому что p && True совпадает с p для любого p. Если же all([]) вернёт False, выходит all(xs) && False == all(xs). Левая часть в таком выражении всегда False, значит, и all(xs) обязано быть False при любом содержимом списка xs. А это противоречит реальности: список из одних истинных значений должен давать True. Поэтому all([]) обязан возвращать True — только так сохраняется свойство композиции списков.

Этот же приём объясняет, почему True называют нейтральным элементом для &&: равенство p && True == p не зависит от значения p. Аналогичные рассуждения приводят к тому, что сумма пустого списка — 0, а any([]) возвращает False. Во всех трёх случаях пустой ввод даёт именно ту величину, которая не ломает математику разбиения списка на части и сохраняет привычные правила для логических и арифметических операций.

Читать оригинал →