Модель данных Python
Эта страница находится в процессе подготовки и не является финальной версией. Содержание будет дорабатываться и обновляться в течение текущего семестра.
Орга низационные моменты
Формат курса, контактная информация и программа — на странице курса.
Типы данных и динамическая типизация
Python использует динамическую типизацию — тип переменной определяется во время выполнения, а не при компиляции. Проверить тип можно функцией type(x), а привести к другому типу — с помощью встроенных функций (int(), str(), float() и т.д.).
x = 1
print(x, type(x)) # 1 <class 'int'>
x = x * 1.5
print(x, type(x)) # 1.5 <class 'float'>
x = str(x)
print(x, type(x)) # 1.5 <class 'str'>
print(type(type(x))) # <class 'type'>
Утиная типизация (duck typing): «Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка». Python не проверяет тип объекта — он проверяет, поддерживает ли объе кт нужный протокол (набор методов).
Переменные и присваивание
В Python переменная — это метка (label), которая ссылается на объект в памяти. Переменная не хранит значение напрямую.
# label = object
x = 42 # имя x ссылается на объект int(42)
y = x # y ссылается на тот же объект
print(id(x) == id(y)) # True — один и тот же объект
Walrus-оператор (:=)
Начиная с Python 3.8 появился моржовый оператор (walrus operator), который совмещает присваиван ие и выражение:
# Без walrus
command = input("> ")
while command != "quit":
print("You entered:", command)
command = input("> ")
# С walrus
while (command := input("> ")) != "quit":
print("You entered:", command)
# Ещё пример
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
Идентичность и равенство (is vs ==)
Для сравнения объектов в Python есть два механизма:
==— проверка равенства значений (вызывает__eq__)is— проверка идентичности (один и тот же объект в памяти)
i, j = 100, 100
print(i == j, i is j) # True True — кэширование малых чисел (-5..256)
x, y = 10**100, 10**100
print(x == y, x is y) # True False — разные объекты с одинаковым значением
Не используйте is для сравнения значений! is проверяет идентичность объекта (один id), а не равенство. Исключение — сравнение с None: if x is None.
Изменяемые и неизменяемые типы
| Immutable (неизменяемые) | Mutable (изменяемые) |
|---|---|
str, bytes | list, bytearray |
int, float, complex | dict |
bool | set |
tuple | collections.deque |
frozenset | collections.Counter |
Неизменяемые типы можно использовать как ключи словарей и элементы множеств, потому что их хэш не меняется. Если нужен «замороженный» список — используйте tuple.