Типы данных в языке Python

Замечание
Последний раз данная статья обновлялась 17.01.2023, информация может быть устаревшей.

Говоря о типах данных, стоит упомянуть, что Python - язык с неявной сильной динамической типизацией (подробнее о видах типизации в языках программирования).

Встроенные и не встроенные типы
В Python типы данных можно разделить на встроенные в интерпретатор (built-in) и не встроенные, которые можно использовать при импортировании соответствующих модулей.
Int - больше, чем просто int
Стандартная реализация Python написана на C (CPython). Это означает, что каждый объект Python — это просто искусно замаскированная структура C, которая содержит не только его значение, но и другую информацию.

Каждое значение в Python имеет тип данных. Поскольку в Python все является объектом, типы данных на самом деле являются классами, а переменные являются экземплярами (объектами) этих классов.

На аппаратном уровне переменная — это ссылка на место в памяти.

Существует три базовых числовых типа: int, float, complex.

int - целые числа. Отрицательные и положительные числа любой длины (ограничением является только количество памяти).

1
2
3
# integer
a = 1000
type(a)  # <class 'int'>

float - числа с плавающей точкой, отрицательные или положительные, содержащие десятичную точку или символ экспоненты e (показатель возведения в степень 10: 35e3, 12E4). Точность до 15 знаков после запятой.

float может принимать значения nan и inf/-inf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# float
b = 12.5634423  # 35e3, 12E4, -87.7e100
type(b)  # <class 'float'>

# Not A Number
x = float("nan")
print(x)  # nan
type(x)  # <class 'float'>

# Аналогично с бесконечностью
y = float("inf")  # inf
z = float("-inf")  # -inf

complex - комплексные числа (x+yj, где x - действительная часть, y - мнимая часть, а j - мнимая единица).

1
2
3
4
5
# complex
c = 3+5j  # 5j, -5j
type(c)  # <class 'complex'>
print(c.real)  # 3.0
print(c.imag)  # 5.0
Python3.x

long - использовался для представления больших целых чисел.

Кроме того, boolean является подтипом int.

В булевом типе данных есть только два типа значений: True и False (встроенные константы чувствительные к регистру).

1
2
type(True)  # <class 'bool'>
type(False)  # <class 'bool'>

Функция приведения типа bool() позволяет оценить любое значение и вернуть True или False.

В Python истинными и ложными значениями считаются не только True и False:

Истинное значение:

  • любое ненулевое число
  • любая непустая строка
  • любой непустой объект

Ложное значение:

  • 0
  • None
  • пустая строка
  • пустой объект

К ним относятся основные:

  • str (строка)
  • list (список)
  • tuple (кортеж)
  • range (диапазон)

и бинарные:

  • bytes (байтовая строка)
  • bytearray (байтовый массив)
  • memoryview (специальные объекты для доступа к внутренним данным объекта через protocol buffer).

Как и все типы данных, последовательности делятся на изменяемые (mutable) и неизменяемые (immutable).

Операции, поддерживаемые большинством последовательностей (изменяемых и неизменяемых):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
x in s  # (x not in s) - проверка принадлежности
s + t  # конкатенация
s * n  #
s[i]  # получение по индексу
s[i:j:k]  # срезы (старт:стоп:шаг)
len(s)  # длина s
min(s)  # минимальный элемент s
max(s)  # максимальный элемент s
s.index(x[, i[, j]])  # индекс первого появления x (at or after index i and before index j)
s.count(x)  # общее кол-во вхождений x в s

hash() - единственная операция, реализованная в неизменяемых типах последовательностей и отсутствующая в изменяемых. Это позволяет использовать неизменяемые последовательности, такие как экземпляры кортежей, в качестве ключей словаря и хранить их в set и frozenset.

Операции над изменяемыми последовательностями:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
s[i] = x
s[i:j] = t
del s[i:j]
s[i:j:k] = t
del s[i:j:k]
s.append(x)
s.clear()
s.copy()
s.extend(t)  # or s += t
s *= n
s.insert(i, x)
s.pop()  # or s.pop(i)
s.remove(x)
s.reverse()

Cтрока (str) - это неизменяемая упорядоченная последовательность символов Юникода. В питоне нет символьного типа данных char, символ представляет собой строку одинарной длины. Строку можно создать различными способами:

1
2
3
4
5
6
7
8
9
# Одинарные кавычки
first_way = 'This is a string'

# Двойные кавычки
second_way = "This is a string"

# Тройные кавычки (одинарные или двойные)
third_way_single = '''This is a string'''
third_way_double = """This is a string"""

Для строк доступны общие операции c последовательностями, а так же дополнительные методы встроенного класса str().

Список (list) — это изменяемая упорядоченная последовательность, обычно используемая для хранения коллекций однородных элементов. Поскольку списки индексируются, то могут содержать элементы с одинаковым значением.

1
2
3
list1 = [10, 20, 30, 77]
list2 = ['one', 'dog', 'seven']
list3 = [1, 20, 4.0, 'word']

Кортеж (tuple) — это неизменяемая упорядоченная последовательность, обычно используемая для хранения коллекций разнородных элементов. Также используются в случаях, когда требуется неизменяемая последовательность однородных данных (например, использование в экземпляре set или dict).

Кортежи, как правило, быстрее, чем списки в Python.

1
2
3
4
5
tuple1 = (1, 2, 5, 6)
tuple2 = tuple('a', 'b', 'c')
tuple3 = ()  # пустой кортеж
tuple4 = 23, 13, 100
tuple5 = ("London", "Tokyo", "Korea", 1986, 1640, 1948)

Тип range представляет собой упорядоченную неизменяемую последовательность чисел и обычно используется для выполнения определенного количества раз циклов for.

Для диапазонов доступны общие операции с последовательностями, кроме конкатенации и повторения.

Проверка диапазонов range на равенство с == и != сравнивает их как последовательности.

Python 3.3 Атрибуты start, stop и step.

Тип данных bytes - это упорядоченная неизменяемая последовательность отдельных байтов. Синтаксис для байтовых строк в основном такой же, как и для обычных строк, за исключением того, что добавляется префикс b.

Bytearray объекты являются упорядоченным неизменяемым аналогом bytes.

Объекты memoryview позволяют коду Python получать доступ к внутренним данным объекта, который поддерживает буферный протокол, без копирования.

Множество - это неупорядоченный набор различных хешируемых объектов. Обычно множества используются для проверки вхождения элемента, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и т. д.

Будучи неупорядоченной коллекцией, множества не сохраняют положение элемента или порядок вставки. Соответственно, не поддерживают индексы, срезы или другое поведение, подобное упорядоченной последовательности.

Существует два встроенных типа множеств: set и frozenset.

Тип set является изменяемым множеством, содержимое может быть изменено с помощью таких методов, как add() и remove(), так же поддерживает операции доступные frozenset. Поскольку тип set является изменяемым, он не имеет хеш-значения и не может использоваться ни как ключ словаря, ни как элемент другого множества.

1
2
3
4
5
6
7
8
# Use the type constructor
set2 = set('a', 'b', 'c')

# Use a comma-separated list of elements within braces
set1 = {1, 2, 5, 6}

# Use a set comprehension
{c for c in 'abracadabra' if c not in 'abc'}

Тип frozenset является неизменяемым и хешируемым множеством, его содержимое не может быть изменено после его создания, поэтому он может использоваться как ключ словаря или как элемент другого множества.

1
2
# Use the type constructor
s = frozenset({'a', 'b', 'c'})

Словарь (dict) — это упорядоченная, изменяемая коллекция пар ключ: значение, в которой не допускается дублирование ключей.

  • Ключи словаря - это произвольные, неизменяемые (хешируемые) значения.
  • Значения элементов словаря могут иметь любой тип данных.

Python 3.7 Словари стали упорядоченными.

Python 3.8 Словари и объекты представления словаря dict.keys(), dict.values(), dict.items() теперь обратимы.

Словарь может быть создан несколькими способами:

1
2
3
4
5
6
7
8
9
# Используя разделенный запятыми список пар ключ: значение в фигурных скобках
dict1 = {'Moscow': 1023, 'SPB': 2048}

# Используя dict comprehension
dict2 = {x: x ** 2 for x in range(10)}

# Используя конструктор типа
dict3 = dict([('foo', 100), ('bar', 200)])
dict4 = dict(foo=100, bar=200)

В других языках программирования тип данных подобный словарю может называться ассоциативный массив, хеш или хеш-таблица.

В Python существуют изменяемые и неизменяемые типы.

Неизменяемые: int, float, complex, bool, tuple, str, frozenset.

Изменяемые: list, set, dict.

При создании переменной, вначале создается объект, который имеет уникальный идентификатор, тип и значение, после этого переменная может ссылаться на созданный объект.

Неизменяемость типа данных означает, что созданный объект больше не изменяется. Например, если мы объявим переменную k = 15, то будет создан объект со значением 15, типа int и идентификатором, который можно узнать с помощью функции id().

1
2
3
k = 15
id(k)  # 1672501744
type(k)  # <class 'int'>

Объект с id = 1672501744 будет иметь значение 15 и изменить его уже нельзя.

Если тип данных изменяемый, то можно менять значение объекта. Например, создадим список [1, 2], а потом заменим второй элемент на 3.

1
2
3
4
5
6
a = [1, 2]
id(a)  # 47997336

a[1] = 3
print(a)  # [1, 3]
id(a)  # 47997336
  • Modules
  • Classes
  • Class Instances
  • Functions
  • Methods
  • Code Objects
  • Type Objects
1
2
3
>>> t = type(None)
>>> type(t)
<class 'type'>
  • The Null Object - None Этот объект возвращается функциями, которые явно не возвращают значение. Он не поддерживает специальные операции. Существует ровно один null объект с именем None (встроенное имя). type(None)() создает один и тот же сиглтон.
  • The Ellipsis Object - Ellipsis или ... Этот объект обычно используется для срезов. Он не поддерживает специальные операции. Существует ровно один объект многоточия с именем Ellipsis (встроенное имя). type(Ellipsis)() создает сиглтон Ellipsis.
  • The NotImplemented Object
  • Internal Objects

Источники:

Python documentation - Built-in Types

Understand How Much Memory Your Python Objects Use

Understanding Data Types in Python