Типы данных в 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-е.
      • Выживание: Если объект пережил проверку сборщиком, он переходит в следующее («старшее») поколение. Чем старше поколение, тем реже оно проверяется (так как старые объекты обычно живут долго).
      • Алгоритм: Сборщик ищет группы объектов, которые ссылаются друг на друга, но недоступны из «внешнего мира» (корневых переменных), и удаляет их целиком.