является ли int неизменяемым типом в python?

a = 100000
old_id = id(a)
a = a + 1
print(id(a) == old_id)

Вывод

False

почему при изменении переменой а создается новый объект? значит ли это, что целочисленный тип неизменяем?


Ответы (2 шт):

Автор решения: CrazyElf

С одной стороны да, числовые типы такие как int действительно иммутабельны - объекты этого типа не изменяются, каждый новый объект, получающийся в результате вычислений - это действительно новый объект. Но есть небольшой нюанс, связанный с интернированием - некоторая часть объектов небольших целых чисел создаётся питоном заранее и при создании очередного объекта с таким значением новый объект не создаётся, а берётся готовый.

def get_ids(x):
    ids = []
    ids.append(id(x))
    x += 1
    ids.append(id(x))
    x -= 1
    ids.append(id(x))
    return ids

ids10000 = get_ids(10000)
print(ids10000, len(set(ids10000)))

ids100 = get_ids(100)
print(ids100, len(set(ids100)))

Примерный вывод:

[139946014475600, 139946014475984, 139946014476336] 3
[94339239358176, 94339239358208, 94339239358176] 2

10000, 10000+1 => 10001 и 10001-1 => 10000 - это 3 разных объекта.
При этом 100, 100+1 => 101 и 101-1 => 100 - это 2 разных объекта, потому что изначальное 100 и конечное 100, полученное через вычисления - это один объект. Такая вот особенность реализации, связанная с оптимизацией (создавать новые объекты дорого).

→ Ссылка
Автор решения: Dmitry

Все верно, int тип не изменяемый.

Что происходит в данном случае? Вы создаете объект типа int и имя a хранит ссылку на этот объект. Именно ссылку.

Когда вы вызываете a = a + 1, то сначала исполняется операция сложение по правую сторону от знака равно, следом создается новый объект под тем же именем a и новая ссылка на этот объект. А старое значение, поскольку больше нет ссылки на этот объект уничтожается. В итоге у вас новый объект и новая ссылка на него, которая хранится под старым именем

→ Ссылка