Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Связь между bool и int в Python
В Python bool — это подкласс int. Это создаёт интересную иерархию типов, где True и False — это специальные целые числа.
1. Иерархия типов
# bool является подклассом int
print(issubclass(bool, int)) # True
print(isinstance(True, int)) # True
print(isinstance(False, int)) # True
# Но не наоборот
print(isinstance(1, bool)) # False
print(isinstance(0, bool)) # False
# Проверка MRO (Method Resolution Order)
print(bool.__mro__) # (<class 'bool'>, <class 'int'>, <class 'object'>)
То есть bool наследует int, но int НЕ наследует bool.
2. Значения True и False как числа
# True == 1, False == 0
print(True == 1) # True
print(False == 0) # True
print(True is 1) # False (разные объекты)
print(True is True) # True (singleton)
# Можно использовать в арифметике
print(True + 5) # 6
print(False + 5) # 5
print(True * 10) # 10
print(False * 10) # 0
# Сравнение
print(True > False) # True
print(True > 0) # False (True == 1, not > 0)
print(True < 2) # True
3. Преобразование между bool и int
int() преобразует bool в int
print(int(True)) # 1
print(int(False)) # 0
# Но это преобразование, не наследование
result = int(True)
print(type(result)) # <class 'int'>
print(isinstance(result, bool)) # False
bool() преобразует int в bool
print(bool(1)) # True
print(bool(0)) # False
print(bool(42)) # True
print(bool(-1)) # True (любое ненулевое число = True)
# Тип меняется
result = bool(1)
print(type(result)) # <class 'bool'>
print(isinstance(result, int)) # True (так как bool подкласс int)
4. Практические примеры где это имеет значение
Пример 1: Ошибочное сравнение
# Неправильно - bool видится как int
def count_active_users(users):
active = sum(user.is_active for user in users)
return active
users = [
{'name': 'Alice', 'is_active': True},
{'name': 'Bob', 'is_active': True},
{'name': 'Charlie', 'is_active': False},
]
active_count = count_active_users(users)
print(active_count) # 2 (sum([True, True, False]) = sum([1, 1, 0]) = 2)
# Это работает, но плохо: bool используется как число
Пример 2: Фильтрация
# Работает, но запутанно
data = [1, 0, True, False, 2, 3]
# Сравнение True и False с числами
print([x for x in data if x is True]) # [True] (не [1, True])
print([x for x in data if x == 1]) # [1, True] (оба равны 1)
print([x for x in data if x is 1]) # [1] (только точное совпадение)
# Осторожнее с == vs is
Пример 3: Словари с bool ключами
d = {}
d[True] = 'true value'
d[1] = 'one value'
print(d) # {True: 'one value'} ← 1 и True это ОДИН ключ!
print(d[True]) # 'one value'
print(d[1]) # 'one value' (True и 1 это один и тот же ключ)
# Аналогично с False и 0
d2 = {False: 'false', 0: 'zero'}
print(d2) # {False: 'zero'} ← False и 0 это один ключ
5. Использование bool в числовых контекстах
Подсчёт True значений
scores = [True, True, False, True, False]
# Правильно
count = sum(scores) # 3
count = sum(1 for x in scores if x) # 3
# Неправильно - путаница
count = len([x for x in scores if x == 1]) # 3 (работает, но неясно)
Операции с битами
# bool работает в битовых операциях
print(True & 1) # 1
print(True | 0) # 1
print(False ^ 1) # 1
print(~True) # -2 (побитовое НЕ)
6. Почему bool наследует int?
Это дизайнерское решение Python для удобства:
# В языках без наследования bool от int:
# C++ — bool и int разные типы
// C++
bool b = true;
int x = b; // Нужно явное преобразование или молчаливое
# Python выбрал удобство
# bool видится как int для числовых операций
condition = True
result = 5 * condition # 5 * True = 5 * 1 = 5 ✓
7. Типизация: использование Type Hints
from typing import Union
# Функция принимает bool, но может получить int
def is_valid(flag: bool) -> bool:
return flag and True
# Это работает, но неправильно типизировано
result = is_valid(1) # Работает! (int видится как bool)
result = is_valid(0) # Работает! (0 == False)
# Лучше использовать строгие проверки
def is_valid_strict(flag: bool) -> bool:
if not isinstance(flag, bool):
raise TypeError(f'Expected bool, got {type(flag)}')
return flag and True
is_valid_strict(1) # TypeError!
8. В контексте баз данных
from sqlalchemy import Column, Integer, Boolean, create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
is_active = Column(Boolean) # bool в БД
score = Column(Integer) # int в БД
# При работе с ORM:
user = User(is_active=True, score=100)
print(type(user.is_active)) # <class 'bool'>
print(type(user.score)) # <class 'int'>
# Но в запросах могут смешиваться
print(user.is_active + user.score) # 101 (True + 100)
9. JSON сериализация
import json
# bool преобразуется в JSON boolean
data = {'active': True, 'count': 1}
json_str = json.dumps(data)
print(json_str) # '{"active": true, "count": 1}'
# При парсинге приходит обратно как bool
parsed = json.loads(json_str)
print(type(parsed['active'])) # <class 'bool'>
print(type(parsed['count'])) # <class 'int'>
10. Лучшие практики
✓ Правильно
# Использовать bool для логики
if user.is_active:
print('User is active')
# Четкие типы
active_users = sum(1 for u in users if u.is_active)
# Type hints
def check_permission(has_role: bool) -> bool:
return has_role
# Явные преобразования
if bool(value): # Явно преобразуем в bool
pass
✗ Неправильно
# Путать bool с числами
count = sum(user.is_active for user in users) # Работает, но неясно
# Использовать True/False как числа
result = True * 100 # Плохо, неясно
# Смешивать bool и int в словарях
dict_mixed = {True: 'a', 1: 'b'} # Конфликт ключей!
# Слабая типизация
def process(flag): # Неясно: bool или int?
pass
Резюме
В Python bool наследует int:
- True == 1, False == 0 — численное равенство
- isinstance(True, int) == True — bool это подкласс int
- int(True) == 1, bool(1) == True — преобразование работает в обе стороны
- Словари: {True: 'a', 1: 'b'} → {True: 'b'} — один и тот же ключ
- Используй type hints — избегай неясности между bool и int
- Избегай bool в числовых контекстах — неясность и ошибки