Типы данных в Python
Виды типизации?
подробнее
- Статическая - тип переменной известен во время компиляции (Java, C++).
- Динамическая - тип определяется во время выполнения (Python, JavaScript).
- Явная - требуется указание типа (например,
int x = 5). - Неявная - тип выводится автоматически (например,
x = 5в Python). - Сильная/Строгая - строгие правила преобразования типов.
Пример: попытка сложить число и строку вызовет ошибку. - Слабая - возможны неявные преобразования.
В языке программирования Python реализованы динамическая, строгая и неявная типизация.
Основные типы данных
подробнее
1. Числовые типы (Numeric Types)
int– целые числа (например,5,-10,1000).float– числа с плавающей точкой (например,3.14,-0.001,2.0)complex– комплексные числа (например,1 + 2j,3 - 4j)- импортируемые:
decimal- десятичные дроби для точных вычислений (например,Decimal('19.99')). В отличие отfloatточнее, но медленнее.fractions- дроби для работы с рациональными числами (например,Fraction(3, 4)=3/4)
2. Последовательности (Sequences)
str– строки (например,"Hello",'Python')list(изменяемый) – списки (изменяемые, например,[1, 2, 3],["a", "b"])tuple– кортежи (неизменяемые, например,(1, 2, 3),("a", "b"))range– диапазон (например,range(5),range(1, 10, 2))
3. Множества (Sets)
set(изменяемый) – изменяемое множество (например,{1, 2, 3})frozenset– неизменяемое множество (например,frozenset({1, 2, 3}))
4. Словари (Mappings)
dict(изменяемый) – словарь (пары ключ-значение, например,{"name": "Alice", "age": 25})
5. Булевый тип (Boolean)
bool– логический тип (TrueилиFalse)
6. Бинарные типы (Binary Types)
bytes– неизменяемая последовательность байт (например,b"hello")bytearray(изменяемый) – изменяемая последовательность байтmemoryview– “вид” памяти для работы с бинарными данными
7. NoneType
None– отсутствие значения (аналогnullв других языках)
Ограничения на длину типов данных
подробнее
- Для
int— нет ограничений (кроме памяти). - Для
float— ограничения по стандарту IEEE 754. Примерный диапазон: от примерно1.8e-308до1.8e+308. При выходе за диапазон получаемinfили-inf.print(sys.float_info.max) # Максимальное значение float - Для
str,list,dictи т.д. — ограничены памятью и значениемsys.maxsize.
Можно ли в кортеж поместить список?
подробнее
Кортеж неизменяемый тип данных. В него можно поместить изменяемые, например списки. В этом случае в кортеже хранится не сам список, а ссылка на него. Из-за наличия изменяемых элементов такой кортеж становится нехэшируемым, а значит, его нельзя использовать в качестве ключа в словаре или элемента множества.
При запуске скрипта получим исключение:TypeError: unhashable type: 'list'
Можно ли изменить элемент в кортеже?
подробнее
Если в кортеже находится изменяемый тип данных, то да.
my_tup = ([], 2)
my_tup[0].append(1)
print(my_tup) # ([1], 2)
Что такое глубокая и поверхностная копия?
подробнее
Поверхностная копия создаёт новый объект, копируя ссылки на вложенные объекты. Если в оригинале вложенный объект поменять, в копии он тоже изменится.
Глубокая копия создаёт новый объект, рекурсивно копирует все вложенные объекты (а не ссылки на них). Полная независимость от оригинала.
Пример:
from copy import copy, deepcopy
a = [3, 4]
b = [1, 2, a]
c = copy(b) # копия содержит: [1, 2, `ссылка на a`]
d = deepcopy(b) # копия содержит: [1, 2, [3, 4]]
a.append(5) # изменили объект a
print(c) # [1, 2, [3, 4, 5]]
print(d) # [1, 2, [3, 4]]
Как работает сборка мусора в Python?
подробнее
В Python (CPython) управление памятью автоматизировано и строится на двух механизмах: подсчете ссылок (основной) и циклическом сборщике мусора (вспомогательный).
- Подсчет ссылок (Reference Counting)
У каждого объекта есть счетчик.+1: когда создается новая ссылка на объект (присваивание переменной, передача в функцию, добавление в список).-1: когда ссылка удаляется (del x), выходит из области видимости (завершение функции) или переменной присваивается другое значение.- Результат: Как только счетчик падает до
0, объект мгновенно удаляется из памяти.
- Сборщик мусора (Generational Garbage Collector)
Подсчет ссылок не справляется с циклическими ссылками (когда объектАссылается наБ, аБнаА, и оба больше не нужны). Для этого существует модульgc.- Как он работает:
- Поколения: Все объекты делятся на три поколения (0, 1, 2). Новые объекты попадают в 0-е.
- Выживание: Если объект пережил проверку сборщиком, он переходит в следующее («старшее») поколение. Чем старше поколение, тем реже оно проверяется (так как старые объекты обычно живут долго).
- Алгоритм: Сборщик ищет группы объектов, которые ссылаются друг на друга, но недоступны из «внешнего мира» (корневых переменных), и удаляет их целиком.
- Как он работает: