← Назад к вопросам

Являются ли все числовые типы данных неизменяемыми в Python

1.7 Middle🔥 141 комментариев
#DevOps и инфраструктура#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Числовые типы и неизменяемость в Python

Да, все встроенные числовые типы в Python неизменяемы (immutable). Это означает, что после создания их значение нельзя изменить. Любая операция над числом создаёт новый объект.

Встроенные числовые типы

# int — целое число
x = 42
print(type(x))  # <class 'int'>

# float — число с плавающей точкой
y = 3.14
print(type(y))  # <class 'float'>

# complex — комплексное число
z = 3 + 4j
print(type(z))  # <class 'complex'>

# bool — логический тип (подкласс int)
b = True
print(type(b))  # <class 'bool'>
print(isinstance(b, int))  # True

Демонстрация неизменяемости

# Попытка изменить число не работает
x = 10
x_id = id(x)
print(f"ID до: {x_id}")

x = x + 5  # Не изменяем x, создаём новый объект
x_id_after = id(x)
print(f"ID после: {x_id_after}")
print(x_id == x_id_after)  # False — разные объекты!

print(x)  # 15

Нет методов для изменения

# int, float, complex НЕ имеют методов изменения значения
x = 42

# Пример: у строк (неизменяемые) есть методы, но они возвращают новую строку
s = "hello"
s_upper = s.upper()  # Не меняет s, возвращает новую строку

# Числовые типы вообще не имеют таких методов
# Всё работает через операторы и переприсваивание

Почему числовые типы неизменяемы

Преимущества неизменяемости:

# 1. Безопасность в многопоточности
import threading

x = 42

def thread_func():
    global x
    x = x + 1  # Операция неатомарная, но это переприсваивание, не изменение

# Так как x неизменяем, нет race conditions по содержимому

# 2. Кэширование малых целых чисел
a = 256
b = 256
print(a is b)  # True — Python кэширует числа от -5 до 256

c = 257
d = 257
print(c is d)  # False — для больших чисел новые объекты

# Кэширование возможно благодаря неизменяемости

# 3. Можно использовать как ключи словаря
my_dict = {1: "one", 2.5: "two-point-five"}
print(my_dict[1])  # "one"

# Если бы числа были изменяемы, ключи могли бы потеряться

Операции с числами создают новые объекты

x = 10
y = x
print(x is y)  # True — один и тот же объект

z = x + 1
print(x is z)  # False — новый объект
print(z)  # 11
print(x)  # 10 — x не изменился

# Другие операции
result = x * 2
print(x is result)  # False

result2 = x ** 2
print(x is result2)  # False

Сравнение с изменяемыми типами

# Неизменяемые: int, float, complex, str, tuple
my_int = 42
my_str = "hello"

# Изменяемые: list, dict, set
my_list = [1, 2, 3]
my_list[0] = 99  # Можем изменить элемент
print(my_list)  # [99, 2, 3]

my_dict = {"a": 1}
my_dict["a"] = 2  # Можем изменить значение
print(my_dict)  # {'a': 2}

# Но числовые типы так не работают
x = 42
# x[0] = 99  # TypeError: 'int' object does not support item assignment

Специальный случай: отсутствие методов изменения

# У int есть методы, но они не меняют значение
x = 42

# Метод bit_length() возвращает новое значение
bit_len = x.bit_length()
print(bit_len)  # 6
print(x)  # 42 — x не изменился

# Метод to_bytes() возвращает новый объект
bytes_repr = x.to_bytes(2, byteorder='big')
print(bytes_repr)  # b'\x00*'
print(x)  # 42 — x не изменился

# Все методы возвращают новые значения

Присваивание ≠ изменение

# Это изменение переменной, не числа
x = 10
x = x + 5
print(x)  # 15

# Но сам объект 10 остался неизменным
# Мы просто переназначили переменную x на новый объект

# Это КЛЮЧЕВОЕ различие:
# - Переменная изменяется (можем переприсвоить)
# - Объект неизменяется (его содержимое не меняется)

a = [1, 2, 3]
a[0] = 99  # Это изменение самого объекта списка
print(a)  # [99, 2, 3]

b = 10
# b[0] = 99  # Невозможно — нельзя изменить содержимое числа
b = 20  # Это переприсваивание переменной, не изменение числа

Неизменяемость и производительность

# Неизменяемость позволяет оптимизировать
# Кэширование малых целых чисел
x = 100
y = 100
print(x is y)  # True

# Интерна строк в f-strings
a = 5
f"{a}"

# Оптимизация памяти благодаря неизменяемости

Исключение: пользовательские числовые классы

from decimal import Decimal

# Decimal — также неизменяем
x = Decimal('10.5')
y = x + Decimal('2')
print(x)  # 10.5 — не изменился
print(y)  # 12.5

# Numpy и другие библиотеки могут иметь свои типы
import numpy as np
arr = np.array([1, 2, 3])
arr[0] = 99  # NumPy массивы изменяемы!
print(arr)  # [99  2  3]

Вывод

  • Все встроенные числовые типы неизменяемы: int, float, complex, bool
  • Неизменяемость означает, что нельзя изменить содержимое объекта после создания
  • Переприсваивание переменной ≠ изменение объекта
  • Преимущества: безопасность потоков, кэширование, использование в качестве ключей
  • Это фундаментальный дизайн Python для повышения производительности и безопасности