Переменные в 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])