Изучаем переменные Python: присваивание, типы, область видимости
Основы работы с переменными в Python
Переменная в Python представляет собой имя, которое ссылается на объект в памяти. Присваивание выполняется оператором =. В отличие от статически типизированных языков, Python использует динамическую типизацию: тип переменной определяется автоматически на основе присвоенного значения и может изменяться в ходе выполнения программы.
message = 'Привет, мир!'
number = 42
pi = 3.14159Python var (переменная в python)
После выполнения этих строк переменная message будет ссылаться на строку, number - на целое число, pi - на число с плавающей точкой. Тип можно проверить функцией type().
Типичная ошибка:
Попытка использовать переменную до присваивания приводит к NameError. Например:
print(x) # NameError: name 'x' is not definedКак присвоить значение нескольким переменным в одной строке?
Множественное присваивание позволяет установить разные значения для нескольких переменных одновременно:
a, b, c = 1, 'Python', 3.14Переменная a получает 1, b - строку 'Python', c - 3.14. Количество переменных должно совпадать с количеством значений, иначе возникнет ValueError.
Ошибка: несоответствие числа переменных и значений.
x, y = 1, 2, 3 # ValueError: too many values to unpackКак обменять значения двух переменных без временной переменной?
В Python обмен реализуется одним выражением:
a, b = 5, 10
a, b = b, a
print(a, b) # 10 5Сначала вычисляется кортеж (b, a), затем он распаковывается в a и b. Это безопасно и не требует дополнительной памяти.
Как создать «константу» в Python?
В языке нет встроенных констант, но по соглашению имена констант пишут заглавными буквами:
MAX_SIZE = 100
DATABASE_URL = 'postgres://...'Это не защищает от изменения, но сообщает другим разработчикам, что значение не должно меняться. Для полной защиты можно использовать typing.Final (Python 3.8+) или модуль enum.
Как проверить тип переменной в Python?
Используйте встроенную функцию type() или isinstance() для проверки принадлежности к типу:
value = 42
print(type(value)) # <class 'int'>
print(isinstance(value, int)) # TrueКак работает ссылочная модель переменных?
В Python переменная - это ссылка на объект. При присваивании b = a обе переменные указывают на один объект. Если объект изменяемый (список, словарь), изменения через одну переменную отразятся на другой:
list1 = [1, 2, 3]
list2 = list1
list2.append(4)
print(list1) # [1, 2, 3, 4]Для копирования изменяемых объектов используйте copy.copy() или срез list1[:].
Расширенные примеры работы с переменными
Эти примеры демонстрируют менее очевидные аспекты переменных в Python.
Распаковка кортежа и использование подчеркивания
При множественном присваивании можно игнорировать некоторые значения с помощью _:
x, _, y = (1, 2, 3)
print(x, y) # 1 3Результат: 1 3. Переменная _ не хранит значение, она используется как соглашение.
Присваивание с распаковкой и звездочкой
Оператор * собирает оставшиеся элементы в список:
first, *middle, last = [1, 2, 3, 4, 5]
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5Результат соответствует комментариям. Если элементов недостаточно, возникает ошибка.
Переменные в циклах и область видимости
Переменная, созданная внутри цикла, остается доступной после его завершения:
for i in range(3):
a = i
a # 2 (последнее значение)Результат: 2. Это может привести к неожиданностям, если не учитывать, что i и a остаются в глобальной области (если цикл выполняется на глобальном уровне).
Использование ключевого слова global
Для изменения глобальной переменной внутри функции необходимо объявление global:
count = 0
def increment():
global count
count += 1
increment()
print(count) # 1Результат: 1. Без global внутри функции создается локальная переменная, и глобальная не изменяется.
Переменные как ссылки: пример с id()
Проверим, что разные имена могут ссылаться на один объект:
a = 256
b = 256
print(id(a), id(b)) # одинаковые идентификаторы (для малых целых чисел Python кэширует объекты)
c = 257
d = 257
print(id(c), id(d)) # разные, так как число больше 256Результат (примерный): 140705123456 140705123456 и 140705123789 140705123888. Для чисел от -5 до 256 интерпретатор использует пул объектов.