Переменные в Python: от объявления до сложных типов

Раздел: Основы Python -> Основы переменных

Основы работы с переменными и типами данных

Переменная в Python – это ссылка на объект в памяти. Интерпретатор сам определяет тип объекта на основе присвоенного значения. Это называется динамической типизацией. Самое эффективное решение для начала работы – присвоить значение простому имени:


name = 'Анна'
age = 25
pi = 3.14159

переменные и типы данных в python (переменные и типы данных в python)

После присваивания переменные можно использовать в выражениях и передавать в функции. Никакого явного объявления типа не требуется.

Типичная ошибка

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

Как присвоить значение нескольким переменным в одной строке?

Используйте множественное присваивание через запятую:


x, y, z = 1, 2, 3

Значения сопоставляются по порядку. Также можно присвоить одно значение нескольким переменным: a = b = c = 0.

Как обменять значения двух переменных без временной переменной?

В Python это делается одной строкой:


a, b = 5, 10
a, b = b, a  # a=10, b=5

Как явно указать ожидаемый тип переменной (для читаемости кода)?

Начиная с Python 3.6 можно использовать аннотации типов (type hints). Они не влияют на выполнение, но помогают инструментам проверки кода:


user_count: int = 42
price: float = 19.99
name: str = 'Магазин'

Проблема

Аннотации не вызывают ошибок при несоответствии типов. Для строгой проверки используйте статический анализатор, например mypy.

Как преобразовать один тип данных в другой?

Встроенные функции int(), float(), str(), bool(), list() и т.д.:


num_str = '123'
num_int = int(num_str)  # 123
text = str(456)         # '456'
print(bool(None))       # False

Типичная ошибка

Не все строки можно преобразовать в число: int('abc') вызывает ValueError. Проверяйте данные перед преобразованием или используйте блок try/except.

Как проверить тип переменной?

Функция type() возвращает объект типа. Для проверки на принадлежность классу используйте isinstance():


value = 3.14
print(type(value))          # <class 'float'>
print(isinstance(value, float))  # True

Как работать с изменяемыми и неизменяемыми типами?

Неизменяемые (int, float, str, tuple, frozenset) – после создания нельзя изменить содержимое. Изменяемые (list, dict, set) – можно модифицировать. Это важно при передаче в функции:


def change_list(lst):
    lst.append(100)

my_list = [1, 2, 3]
change_list(my_list)
print(my_list)  # [1, 2, 3, 100]

Неожиданное поведение

При копировании изменяемого объекта через простое присваивание (new = original) обе переменные ссылаются на один объект. Для создания независимой копии используйте .copy() или deepcopy().

Расширенные примеры работы с переменными и типами

Распаковка с помощью звёздочки (*)

Пример

first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last)  # 1 [2, 3, 4] 5
1 [2, 3, 4] 5

Использование именованных кортежей (namedtuple) из модуля collections

Пример

from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
p = Person('Иван', 30, 'Москва')
print(p.name, p.age, p.city)
Иван 30 Москва

Применение dataclasses для автоматического создания методов

Пример

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float
    quantity: int = 1

prod = Product('Книга', 450.0)
print(prod)
Product(name='Книга', price=450.0, quantity=1)

Безопасное преобразование типов с обработкой ошибок

Пример

def safe_int(value, default=0):
    try:
        return int(value)
    except (ValueError, TypeError):
        return default

print(safe_int('abc'))     # 0
print(safe_int('123'))     # 123
print(safe_int(None))      # 0
0
123
0

Проверка типов с помощью модуля typing (для сложных структур)

Пример

from typing import List, Dict, Optional

Data = List[Dict[str, Optional[int]]]

def process(data: Data) -> None:
    for item in data:
        print(item.get('key', 'missing'))

sample = [{'key': 10}, {'key': None}, {}]
process(sample)
10
None
missing

Изменение типа переменной в процессе выполнения (динамическая типизация)

Пример

variable = 42
print(f'Тип: {type(variable).__name__}, значение: {variable}')
variable = 'теперь строка'
print(f'Тип: {type(variable).__name__}, значение: {variable}')
variable = [1, 2, 3]
print(f'Тип: {type(variable).__name__}, значение: {variable}')
Тип: int, значение: 42
Тип: str, значение: теперь строка
Тип: list, значение: [1, 2, 3]

Копирование изменяемых объектов: поверхностное и глубокое

Пример

import copy
original = {'a': [1,2], 'b': [3,4]}
shallow = original.copy()
shallow['a'].append(99)
print(original)  # {'a': [1,2,99], 'b': [3,4]}

deep = copy.deepcopy(original)
deep['a'].append(100)
print(original)  # {'a': [1,2,99], 'b': [3,4]} – не изменился
print(deep)      # {'a': [1,2,99,100], 'b': [3,4]}
{'a': [1, 2, 99], 'b': [3, 4]}
{'a': [1, 2, 99], 'b': [3, 4]}
{'a': [1, 2, 99, 100], 'b': [3, 4]}

Работа с неизменяемыми типами (tuple, frozenset) – попытка изменить

Пример

t = (1, 2, [3, 4])
try:
    t[0] = 10
except TypeError as e:
    print(f'Ошибка: {e}')
# Но можно изменить изменяемый элемент внутри:
t[2].append(5)
print(t)  # (1, 2, [3, 4, 5])
Ошибка: 'tuple' object does not support item assignment
(1, 2, [3, 4, 5])

Переменные и типы данных в Python - comments

En
переменные и типы данных в python (python)