Перейти к содержимому
Теория · Переменные и типы · урок 1 из 7

Переменные

Чему вы научитесь

Чему вы научитесь:

  • создавать переменные и менять их значения;
  • объяснять, почему после b = a и a = 20 в b остаётся старое значение;
  • различать типы int, float, str, bool и None и узнавать тип через type();
  • превращать строку в число и число в строку через int(), float() и str().
Бирка price на длинной нитке привязана к жетону 250 и лишь указывает на него

Представьте багажную бирку на длинной нитке. На бирке написано price, а нитка привязана к круглому жетону с числом 250. Бирка и жетон — два разных предмета: бирка не хранит число внутри, она только указывает на жетон.

Так устроены переменные в Python. Имя — это бирка, а значение — жетон, к которому она привязана.

Зачем вообще нужны имена? Программа часто использует одно значение в нескольких строках: цену товара, счёт в игре, число попыток. Если писать само число в каждой строке, при смене цены придётся исправлять их все. Вместо этого значению дают имя и дальше пишут имя:

Python
price = 250
count = 3
print(price * count)  # 750
print(price, count)  # 250 3

Давайте разберём пример по строкам:

  1. price = 250 привязывает бирку price к жетону 250.
  2. count = 3 привязывает бирку count к жетону 3.
  3. print(price * count) находит оба жетона по биркам, умножает числа и печатает 750.
  4. print(price, count) печатает 250 3: значения, на которые указывают бирки, а не сами имена.

Если цена изменится, достаточно поправить одну первую строку.

Имя и объект

Строка price = 250 — это присваивание. Python вычисляет выражение справа от = и связывает с результатом имя слева. Такое имя называют переменной. Объявлять переменную заранее не нужно: она появляется при первом присваивании.

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

Знак = — не равенство из математики, а команда. Сначала вычисляется правая часть, и только потом имя связывается с результатом. Поэтому запись x = x + 1 имеет смысл: Python берёт текущее значение x, прибавляет к нему 1 и перевязывает бирку x на новый объект.

Переприсваивание

Новое присваивание перевязывает бирку на другой объект. Другие бирки при этом остаются на месте:

Python
a = 10
b = a
a = 20
print(a, b)  # 20 10

Разберём по шагам:

  1. a = 10 привязывает бирку a к объекту 10.
  2. b = a не связывает b с именем a. Она привязывает вторую бирку b к тому же объекту 10, на который сейчас указывает a.
  3. a = 20 перевязывает на новый объект 20 только бирку a.
  4. print(a, b) печатает 20 10: бирка b по-прежнему висит на 10.

Нажмите «Следующий шаг» и следите за y: после строки x = 7 её значение остаётся прежним.

ВживуюДве бирки на одном значениишаг 1 из 7 · рамок: 1

Бирка x привязана к объекту 5.

Следите за y после строки x = 7

Этот вопрос часто задают на собеседовании: «Изменится ли b, если после b = a присвоить a новое значение?» Ответ — нет. Присваивание перевязывает только ту бирку, имя которой стоит слева от =.

Здесь аналогия с биркой перестаёт работать: бирки без жетона не бывает. Имя появляется только в момент присваивания, сразу вместе с объектом. До этого такой бирки у Python нет.

Короткие формы += и -=

Запись score += 5 — короткая форма score = score + 5. Так же работают -= и *=:

Python
score = 0
score += 5
score -= 2
print(score)  # 3

Давайте разберём по шагам:

  1. score = 0 задаёт начальное значение.
  2. score += 5 берёт 0, прибавляет 5 и перевязывает score на 5.
  3. score -= 2 берёт 5, вычитает 2, и теперь score указывает на 3.
  4. print(score) печатает 3.

Имена переменных

Для имён в Python действуют три правила:

  • по PEP 8 имена пишут строчными буквами, а слова разделяют подчёркиванием: item_count, max_speed;
  • имя не начинается с цифры;
  • регистр букв важен: Score и score — две разные переменные.

Частая ошибка

Запись += использовали для переменной, которой ещё ничего не присвоили:

Python
total += 5  # ✗
print(total)
TEXT
NameError: name 'total' is not defined

total += 5 сначала читает текущее значение total, а его нет: бирки total ещё не существует. Программа останавливается на этой строке с ошибкой NameError. Перед первым += переменной нужно присвоить начальное значение, например total = 0.

Главное

  • Переменная — имя-бирка, которое ссылается на объект; она появляется при первом присваивании.
  • = сначала вычисляет правую часть, а потом привязывает к результату имя слева.
  • После b = a обе бирки висят на одном объекте, а a = 20 перевязывает только a.
  • x += 1 — короткая форма x = x + 1, и до неё у x уже должно быть значение.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом