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

Числовые типы данных изменяемые или неизменяемые

1.6 Junior🔥 221 комментариев
#Другое

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

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

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

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

Числовые типы данных в Python — неизменяемые (immutable). Это означает, что после создания объекта его значение нельзя изменить. Вместо этого создается новый объект в памяти.

Что такое неизменяемость

Immutable (неизменяемый) — объект, который нельзя модифицировать на месте. Если нужно "изменить" значение, создается новый объект, а переменная указывает на него.

# Числовые типы: int, float, complex
# Все они НЕИЗМЕНЯЕМЫЕ

x = 10
print(id(x))  # 140234567890000 (адрес в памяти)

x = 20
print(id(x))  # 140234567890001 (НОВЫЙ адрес в памяти)
# x создалась новая, старая осталась в памяти

Числовые типы данных

1. int (целые числа)

a = 5
print(type(a))  # <class 'int'>
print(id(a))    # 94342975678560

a = 10  # Не изменяем a, а создаём новый объект
print(id(a))    # 94342975678612 (другой адрес)

2. float (числа с плавающей точкой)

pi = 3.14
print(type(pi))  # <class 'float'>
print(id(pi))    # 94342975678480

pi = 3.14159  # Новый объект
print(id(pi))    # 94342975678512 (другой адрес)

3. complex (комплексные числа)

c = 3 + 4j
print(type(c))  # <class 'complex'>
print(id(c))    # 94342975678544

c = 5 + 6j  # Новый объект
print(id(c))    # 94342975678576 (другой адрес)

Докупки на примерах

Попытка "изменить" число — не работает

x = 10
x += 5  # Выглядит как изменение, но на самом деле x = x + 5

print(x)  # 15
# На самом деле произошло:
# 1. Создан новый объект со значением 15
# 2. Переменная x указывает на новый объект
# 3. Старый объект (10) остаётся в памяти до garbage collection

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

# Список (ИЗМЕНЯЕМЫЙ)
list1 = [1, 2, 3]
print(id(list1))  # 94342975678000

list1[0] = 99  # Изменяем элемент НА МЕСТЕ
print(id(list1))  # 94342975678000 (ТОТ ЖЕ список!)
print(list1)      # [99, 2, 3]

# Число (НЕИЗМЕНЯЕМОЕ)
num = 10
print(id(num))    # 94342975678100

num = 99  # Создаём НОВЫЙ объект
print(id(num))    # 94342975678200 (НОВЫЙ адрес)

Почему это важно: проблемы при работе с функциями

Числа — новые объекты, поэтому изменения внутри функции не влияют на оригинал

def increment(x):
    x = x + 1  # Создаём новый объект x
    return x

num = 5
result = increment(num)
print(num)     # 5 (не изменилось!)
print(result)  # 6 (новое значение)

Списки — изменяемые, поэтому изменения внутри функции влияют на оригинал

def modify_list(lst):
    lst[0] = 999  # Изменяем элемент НА МЕСТЕ

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # [999, 2, 3] (изменилось!)

Проверка изменяемости

# Функция try_to_modify() — универсальный тест
def try_to_modify(obj):
    original_id = id(obj)
    print(f"Original ID: {original_id}")
    
    # Для чисел
    if isinstance(obj, (int, float, complex)):
        obj = obj + 1
    # Для строк
    elif isinstance(obj, str):
        obj = obj + "_modified"
    # Для списков
    elif isinstance(obj, list):
        obj[0] = "modified"
    
    print(f"New ID: {id(obj)}")
    print(f"Same object? {original_id == id(obj)}")

try_to_modify(5)
# Original ID: 94342975678100
# New ID: 94342975678200
# Same object? False (НОВЫЙ объект)

try_to_modify([1, 2, 3])
# Original ID: 94342975678000
# New ID: 94342975678000
# Same object? True (ТОТ ЖЕ объект)

Неизменяемость и кэширование

Python кэширует малые целые числа (-5 до 256) для оптимизации:

a = 5
b = 5
print(a is b)  # True (один и тот же объект)
print(id(a) == id(b))  # True

c = 257
d = 257
print(c is d)  # False (разные объекты)
print(id(c) == id(d))  # False

Это оптимизация для часто используемых чисел, но не меняет принцип неизменяемости.

Почему неизменяемость важна

1. Безопасность

# Если число неизменяемо, можно передавать его везде
def process(x):
    x = x * 2
    return x

original = 10
result = process(original)
# Уверены, что original не изменится
print(original)  # 10

2. Как ключи словарей

# Числа можно использовать как ключи (неизменяемые)
dict1 = {1: "one", 2: "two", 3.14: "pi"}
print(dict1[1])  # "one"

# Списки — нельзя (изменяемые)
# dict2 = {[1, 2]: "value"}  # TypeError

3. В множествах

# Числа в sets — ок
set1 = {1, 2, 3, 4}
print(2 in set1)  # True

# Списки в sets — ошибка
# set2 = {[1, 2], [3, 4]}  # TypeError

Заключение

Числовые типы (int, float, complex) — это неизменяемые объекты. Когда кажется, что мы "изменили" число, на самом деле создан новый объект, а переменная указывает на него. Это делает числа безопасными для передачи в функции и пригодными для использования в качестве ключей словарей и элементов множеств.