Какие знаешь типы данных в Python
В Python типы данных делятся на изменяемые (mutable) и неизменяемые (immutable). К изменяемым относятся list, dict, set, bytearray, а к неизменяемым — int, float, bool, tuple, frozenset, str. Также выделяют NoneType, bytes и complex, которые занимают особое место. Понимание этой классификации важно для предсказания поведения объектов при их передаче в функции, копировании и использовании в качестве ключей словаря.
Как это работает
Изменяемые объекты можно модифицировать после создания: добавлять или удалять элементы, менять значения. Например, в list можно добавить элемент методом append(), а в dict — присвоить значение по ключу. Неизменяемые объекты, наоборот, нельзя изменить после создания; любая операция, которая кажется изменением, на самом деле создаёт новый объект. Например, конкатенация строк возвращает новую строку, а исходная остаётся без изменений.
Эта разница влияет на:
- Передачу в функции: изменяемые объекты передаются по ссылке, и изменения внутри функции видны снаружи; неизменяемые — по значению, изменения не влияют на оригинал.
- Использование в качестве ключей словаря: ключи должны быть неизменяемыми, так как словарь использует хеш-таблицу, и изменение ключа после вставки нарушило бы её целостность.
- Копирование: для изменяемых объектов нужно использовать
copy()илиdeepcopy(), чтобы избежать неожиданного изменения оригинала.
Примеры типов
| Категория | Типы | Примеры |
|---|---|---|
| Изменяемые | list, dict, set, bytearray | [1, 2], {'a': 1}, {1, 2}, bytearray(b'abc') |
| Неизменяемые | int, float, bool, tuple, frozenset, str | 42, 3.14, True, (1, 2), frozenset({1}), 'hello' |
| Особые | NoneType, bytes, complex | None, b'abc', 1+2j |
NoneType — единственный представитель None, обозначает отсутствие значения. bytes — неизменяемая последовательность байтов, а complex — комплексное число, также неизменяемое.
Подводные камни
- Путаница между
tupleиlist:tupleнеизменяем, но если внутри него лежит изменяемый объект (например, список), то этот объект можно менять. Сам кортеж при этом остаётся неизменным по структуре. frozensetvsset:frozenset— неизменяемая версияset, поэтому может быть ключом словаря, а обычныйset— нет.bytearrayvsbytes:bytearrayизменяем,bytes— нет. Это часто упускают из виду.str— неизменяемый, но операции вродеreplace()возвращают новую строку, что может привести к неэффективности при частых модификациях в цикле.
Когда использовать
Выбор типа зависит от задачи:
- Если нужен изменяемый упорядоченный набор —
list. - Если нужен неизменяемый упорядоченный набор —
tuple(например, для ключей словаря). - Если нужна уникальность элементов —
setилиfrozenset. - Если нужны пары «ключ-значение» —
dict. - Для бинарных данных —
bytes(неизменяемый) илиbytearray(изменяемый).
Коротко
- Изменяемые:
list,dict,set,bytearray. - Неизменяемые:
int,float,bool,tuple,frozenset,str. - Особые:
NoneType,bytes,complex. - Неизменяемость определяет возможность использования в качестве ключа словаря и поведение при передаче в функции.
