← Назад к вопросам

Как связан bool и int в Python?

2.0 Middle🔥 81 комментариев
#Python Core

Комментарии (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:

  1. True == 1, False == 0 — численное равенство
  2. isinstance(True, int) == True — bool это подкласс int
  3. int(True) == 1, bool(1) == True — преобразование работает в обе стороны
  4. Словари: {True: 'a', 1: 'b'} → {True: 'b'} — один и тот же ключ
  5. Используй type hints — избегай неясности между bool и int
  6. Избегай bool в числовых контекстах — неясность и ошибки