PythonJuniorTechnical
Что такое truthy и falsy значения в Python?
Falsy значения в Python: None, False, 0, 0.0, '', [], {}, set(), и объекты, у которых __bool__ возвращает False или __len__ возвращает 0. Всё остальное — truthy.
Truthy и falsy значения в Python
Python оценивает любой объект как булево значение в контексте условий (if, while, логические операторы). Объект считается falsy, если он «пустой» или «нулевой», и truthy — в противном случае.
Полный список falsy значений
NoneFalse- Числовой ноль:
0,0.0,0j(комплексный),Decimal(0),Fraction(0, 1) - Пустые коллекции:
"",b"",[],(),{},set(),frozenset() - Объекты, у которых
__bool__возвращаетFalseили__len__возвращает0
Примеры поведения
falsy_values = [None, False, 0, 0.0, "", [], {}, set()]
for val in falsy_values:
assert not val, f"{val!r} должно быть falsy"
# Truthy примеры
assert 1
assert "0" # непустая строка
assert [False] # список с одним элементом
assert {0} # множество с нулём
assert 0.1
# Практическое применение
users = []
if not users:
print("Список пользователей пуст")
name = ""
display = name or "Аноним" # "Аноним"
print(display)
timeout = None
effective = timeout or 30 # 30
Пользовательские объекты
class Cart:
def __init__(self, items: list) -> None:
self.items = items
def __bool__(self) -> bool:
return len(self.items) > 0
def __len__(self) -> int:
return len(self.items)
empty_cart = Cart([])
full_cart = Cart(["apple", "bread"])
if not empty_cart:
print("Корзина пуста") # выведется
if full_cart:
print("Корзина не пустая") # выведется
Логические операторы возвращают объекты, а не bool
# 'or' возвращает первый truthy операнд или последний
print(0 or "" or 42) # 42
print(0 or "" or None) # None
# 'and' возвращает первый falsy операнд или последний
print(1 and 2 and 3) # 3
print(1 and 0 and 3) # 0
Подводные камни
- Проверка
if x:вместоif x is not None:ошибочна, когда0или[]— валидные значения (например, пустой список как результат запроса). - Строка
"0","False","None"— все truthy, потому что непустые строки; новички часто ожидают обратного. - NumPy массивы:
bool(np.array([0, 1]))выбрасываетValueError— используйте.any()/.all(). - Если класс определяет
__len__без__bool__, Python использует__len__ != 0как булево значение — это неочевидно. - Паттерн
val = arg or defaultне работает еслиarg=0илиarg=""— используйтеval = arg if arg is not None else default. - В pandas
bool(Series)тоже выбрасывает исключение — требуется явное.emptyилиlen().
Common mistakes
- Говорить, что условие принимает только bool.
- Не отличать None от других falsy-значений.
- Забывать про bool и len.
What the interviewer is testing
- Называет основные falsy-значения.
- Понимает bool-протокол.
- Выбирает is None, когда важна именно отсутствующая величина.