Переменные, имена и базовые типы
Переменная — это имя
В Python переменная не «коробка с значением», а ярлык на объекте. Присваивание = привязывает имя к объекту.
x = 10
y = x # y — второе имя того же объекта
x = 20 # x теперь указывает на другой объект; y не изменился
print(x, y)
Аналогия
Объекты — это вещи на складе, а имена — бирки на верёвочках. y = x вешает вторую бирку на ту же вещь. x = 20 перевешивает бирку x на другую вещь, а бирка y остаётся на прежней.
Нажмите 👣 Пошагово на примере ниже. Для списка (изменяемого объекта) визуализатор покажет, что оба имени ссылаются на один объект #1:
a = [1, 2, 3]
b = a # не копия! второе имя того же списка
b.append(4)
print(a) # [1, 2, 3, 4] — изменился «и a тоже»
Это одна из главных тем собеседований. Мы подробно разберём её в модуле «Модель данных и память».
Присваивание
# множественное присваивание
name, age = "Анна", 28
# одно значение нескольким именам
x = y = 0
# обмен значений без временной переменной
a, b = 1, 2
a, b = b, a
print(name, age, x, y, a, b)
# расширенное присваивание
counter = 10
counter += 5 # counter = counter + 5
counter *= 2
print(counter)
a, b = b, a работает так: справа создаётся кортеж (b, a), затем он распаковывается в имена слева.
Правила именования
- Буквы, цифры и
_, но не с цифры:user1,_tmp,MAX_SIZE. - Регистр важен:
nameиName— разные имена. - Нельзя использовать ключевые слова:
if,for,class,def,return,None,True,lambda…
| Стиль (PEP 8) | Для чего | Пример |
|---|---|---|
snake_case |
переменные, функции, модули | total_price, get_user() |
PascalCase |
классы | UserProfile |
UPPER_CASE |
константы | MAX_RETRIES = 3 |
_name |
«внутреннее», не для внешнего использования | _cache |
Не затирайте встроенные имена
list = [1, 2], str = "x", id = 5 — синтаксически можно, но после этого встроенные list(), str(), id() в этом модуле перестанут работать. Классическая ошибка новичков.
list = [1, 2, 3] # затёрли встроенный list
print(list("abc")) # TypeError: 'list' object is not callable
Базовые типы
| Тип | Пример | Что это |
|---|---|---|
int |
42, -7, 1_000_000 |
целые числа произвольной длины |
float |
3.14, 1e-3 |
числа с плавающей точкой (IEEE 754, 64 бита) |
bool |
True, False |
логический тип, подкласс int |
str |
"привет", 'a' |
строка Unicode, неизменяемая |
NoneType |
None |
«ничего», отсутствие значения |
print(type(42), type(3.14), type(True), type("hi"), type(None))
print(2 ** 100) # int не переполняется
print(isinstance(5, int), isinstance(5, (int, float)))
type(x) возвращает точный тип, а isinstance(x, T) проверяет «x — экземпляр T или его подкласса». В коде почти всегда используют isinstance.
Преобразование типов
print(int("42") + 1) # 43
print(float("3.5") * 2) # 7.0
print(str(10) + "0") # '100'
print(int(3.99)) # 3 — отбрасывает дробную часть, не округляет
print(bool(0), bool(""), bool("0"), bool([])) # False False True False
print(int("3.5")) # ValueError: строку с точкой int() не понимает
Запомните
int("3.5") — ошибка, а int(float("3.5")) — 3. bool("0") — True: непустая строка всегда истинна.
None
None — единственный объект своего типа. Им обозначают «значения нет»: функция ничего не вернула, поле не заполнено.
result = None
if result is None: # сравнивают с None через is, а не ==
print("Пока пусто")
Итог
- Переменная — имя, привязанное к объекту;
=не копирует. - Множественное присваивание и обмен
a, b = b, a. - Именование:
snake_case, классыPascalCase, константыUPPER_CASE; не затирайте встроенные имена. - Базовые типы:
int(без переполнения),float,bool(подкласс int),str,None. isinstanceпредпочтительнееtype(...) ==; сNoneсравнивают черезis.
Практика решено 0 из 6
Что происходит при выполнении x = 42?
Поменяйте значения переменных a и b местами без третьей переменной
(используйте множественное присваивание).
Какие тесты проверяют код (2)
assert a == "правый" assert b == "левый"
a = "левый"
b = "правый"
a, b = b, a
Допустимо ли имя переменной в Python?
| Допустимо | Ошибка | |
|---|---|---|
user_name |
||
2nd_place |
||
_private |
||
class |
||
имя |
||
total-sum |
Какой тип у значения?
| int | float | str | bool | NoneType | |
|---|---|---|---|---|---|
7 |
|||||
7.0 |
|||||
"7" |
|||||
True |
|||||
None |
|||||
1e3 |
В переменной raw лежит строка с числом. Создайте переменную n — это число как int,
и переменную half — половину n как float.
Какие тесты проверяют код (4)
assert n == 37 assert type(n) is int, "n должна быть int, а не строкой" assert half == 18.5 assert type(half) is float
raw = "37"
n = int(raw)
half = n / 2
Что вернёт isinstance(True, int)?
Войдите, чтобы отмечать пройденные уроки.