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

По какому фактору группировал бы примитивные типы данных

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

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Классификация примитивных типов данных в Python

Примитивные типы данных в Python можно группировать по нескольким факторам. Расскажу о наиболее важных и практичных из них.

1. По изменяемости (Mutability) — ОСНОВНОЙ ФАКТОР

Это самый важный фактор при работе с типами в Python, так как влияет на поведение и производительность.

Неизменяемые типы (Immutable):

  • int — целые числа
  • float — числа с плавающей точкой
  • str — строки
  • bool — логические значения
  • tuple — кортежи
  • frozenset — замороженные множества
  • bytes — байтовые строки

Изменяемые типы (Mutable):

  • list — списки
  • dict — словари
  • set — множества
  • bytearray — массивы байтов
# Неизменяемость в действии
a = (1, 2, 3)
# a[0] = 5  # TypeError: 'tuple' object does not support item assignment

b = [1, 2, 3]
b[0] = 5  # OK, работает
print(b)  # [5, 2, 3]

# Важная разница в функциях
original = [1, 2, 3]
modified = original  # обе переменные указывают на одинаковый объект
modified.append(4)
print(original)  # [1, 2, 3, 4] — изменилось и оригинальное!

# С неизменяемыми типами этого не происходит
original_str = "hello"
modified_str = original_str
modified_str = modified_str + " world"  # создаётся новый объект
print(original_str)  # "hello" — не изменилось

2. По численному типу (Numeric)

Целочисленные типы:

  • int — целые числа (неограниченная точность в Python 3)
  • bool — подкласс int, значения True (1) и False (0)

Типы с плавающей точкой:

  • float — числа с плавающей точкой (IEEE 754)
  • complex — комплексные числа (вещественная и мнимая части)
# Численные типы
int_val = 42
float_val = 3.14
bool_val = True
complex_val = 3 + 4j

# Важно: bool является подклассом int
print(isinstance(True, int))  # True
print(True + 5)  # 6

# Различие в точности
print(0.1 + 0.2)  # 0.30000000000000004 — ошибка float
print(int(0.1) + int(0.2))  # 0 — потеря информации

3. По типу содержимого (Содержимое и контейнеры)

Скалярные типы (один элемент):

  • int, float, bool, str, bytes

Коллекционные типы (несколько элементов):

  • list, tuple, set, frozenset, dict
# Скалярные типы — одиночные значения
scalar = 42
scalar_str = "hello"

# Коллекционные типы — несколько значений
collection = [1, 2, 3, 4]
mapping = {"key": "value"}

4. По упорядоченности (Sequencing)

Упорядоченные типы (ordered):

  • str — строки (каждый символ имеет индекс)
  • list — списки (порядок сохраняется)
  • tuple — кортежи (порядок сохраняется)
  • bytes, bytearray — последовательности байтов

Неупорядоченные типы (unordered):

  • set — множества (нет индекса, нет гарантии порядка)
  • frozenset — замороженные множества
  • dict — в Python 3.7+ сохраняет порядок вставки, но семантически неупорядочен
# Упорядоченные типы — можно обращаться по индексу
ordered = [1, 2, 3]
print(ordered[0])  # 1
print(ordered[1])  # 2

# Неупорядоченные типы — нет индекса
unordered = {1, 2, 3}
# print(unordered[0])  # TypeError

for item in unordered:
    print(item)  # порядок не гарантирован

5. По хешируемости (Hashability)

Хешируемые типы (можно использовать как ключи в dict):

  • int, float, bool, str, bytes, tuple
  • frozenset, None

Нехешируемые типы (нельзя использовать как ключи):

  • list, dict, set, bytearray
# Хешируемые типы — можно как ключи
dict_with_tuple = {(1, 2): "value"}  # OK
dict_with_int = {42: "answer"}  # OK

# Нехешируемые типы — будет ошибка
# dict_with_list = {[1, 2]: "value"}  # TypeError: unhashable type: 'list'

# Важно для sets
set_of_tuples = {(1, 2), (3, 4)}  # OK
# set_of_lists = {[1, 2], [3, 4]}  # TypeError

Таблица сравнения основных примитивов

ТипMutabilityOrderedHashableРазмерИспользование
intNoYesПеременныйЦелые числа
floatNoYes8 байтЧисла с точкой
strNoYesYesПеременныйТекст
boolNoYes1 бит (28 байт)Логика
listYesYesNoПеременныйИзменяемый массив
tupleNoYesYesПеременныйНеизменяемый массив
dictYesYes*NoПеременныйКлюч-значение
setYesNoNoПеременныйУникальные элементы
bytesNoYesYesПеременныйДвоичные данные

Практическая рекомендация

На собеседовании я бы группировал по изменяемости, так как это:

  1. Влияет на производительность — неизменяемые типы можно кешировать, использовать в dict как ключи
  2. Влияет на безопасность — передача неизменяемых типов в функции не приведёт к неожиданным изменениям
  3. Влияет на функциональное программирование — неизменяемость упрощает многопоточность
  4. Это основной концепт Python — памятка об этом есть в документации
# Демонстрация почему mutability важна
def modify_data(data):
    if isinstance(data, list):
        data.append(999)  # Изменит оригинальный список!
    elif isinstance(data, tuple):
        # data += (999,)  — создаст новый объект, оригинал не изменится
        pass

my_list = [1, 2, 3]
modify_data(my_list)
print(my_list)  # [1, 2, 3, 999] — ИЗМЕНИЛОСЬ!

my_tuple = (1, 2, 3)
original_id = id(my_tuple)
modify_data(my_tuple)
print(my_tuple)  # (1, 2, 3) — не изменилось