← Назад к вопросам
По какому фактору группировал бы примитивные типы данных
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,tuplefrozenset,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
Таблица сравнения основных примитивов
| Тип | Mutability | Ordered | Hashable | Размер | Использование |
|---|---|---|---|---|---|
int | No | — | Yes | Переменный | Целые числа |
float | No | — | Yes | 8 байт | Числа с точкой |
str | No | Yes | Yes | Переменный | Текст |
bool | No | — | Yes | 1 бит (28 байт) | Логика |
list | Yes | Yes | No | Переменный | Изменяемый массив |
tuple | No | Yes | Yes | Переменный | Неизменяемый массив |
dict | Yes | Yes* | No | Переменный | Ключ-значение |
set | Yes | No | No | Переменный | Уникальные элементы |
bytes | No | Yes | Yes | Переменный | Двоичные данные |
Практическая рекомендация
На собеседовании я бы группировал по изменяемости, так как это:
- Влияет на производительность — неизменяемые типы можно кешировать, использовать в dict как ключи
- Влияет на безопасность — передача неизменяемых типов в функции не приведёт к неожиданным изменениям
- Влияет на функциональное программирование — неизменяемость упрощает многопоточность
- Это основной концепт 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) — не изменилось