Числовые типы данных изменяемые или неизменяемые
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Числовые типы данных: изменяемость в 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) — это неизменяемые объекты. Когда кажется, что мы "изменили" число, на самом деле создан новый объект, а переменная указывает на него. Это делает числа безопасными для передачи в функции и пригодными для использования в качестве ключей словарей и элементов множеств.