является ли int неизменяемым типом в python?
a = 100000
old_id = id(a)
a = a + 1
print(id(a) == old_id)
Вывод
False
почему при изменении переменой а создается новый объект? значит ли это, что целочисленный тип неизменяем?
Ответы (2 шт):
С одной стороны да, числовые типы такие как 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, полученное через вычисления - это один объект. Такая вот особенность реализации, связанная с оптимизацией (создавать новые объекты дорого).
Все верно, int тип не изменяемый.
Что происходит в данном случае? Вы создаете объект типа int и имя a хранит ссылку на этот объект. Именно ссылку.
Когда вы вызываете a = a + 1, то сначала исполняется операция сложение по правую сторону от знака равно, следом создается новый объект под тем же именем a и новая ссылка на этот объект. А старое значение, поскольку больше нет ссылки на этот объект уничтожается. В итоге у вас новый объект и новая ссылка на него, которая хранится под старым именем