Вопрос проверяет понимание механизма работы с неизменяемыми объектами в Python, что важно для предотвращения ошибок, связанных с неожиданным поведением при присваивании и передаче аргументов.
В Python память управляется с помощью механизма подсчёта ссылок и сборщика мусора. Неизменяемые объекты (immutable) — это объекты, состояние которых нельзя изменить после создания. К ним относятся, например, целые числа (int), числа с плавающей точкой (float), строки (str), кортежи (tuple) и frozenset.
Когда вы создаёте неизменяемый объект, Python выделяет для него память. Переменная в Python — это всего лишь имя, которое ссылается на этот объект в памяти. Если вы присваиваете ту же самую значение другой переменной, обе переменные начинают ссылаться на один и тот же объект. Это можно проверить с помощью оператора is или функции id().
a = 10
b = 10
print(a is b) # True, потому что Python может кэшировать маленькие целые числа
print(id(a) == id(b)) # True, тот же идентификатор в памяти
x = "hello"
y = "hello"
print(x is y) # Часто True из-за интернирования строкПоскольку объект неизменяем, любая операция, которая кажется изменяющей его, на самом деле создаёт новый объект. Переменная затем начинает ссылаться на этот новый объект.
a = 5
print(id(a)) # Допустим, 140736123456789
a = a + 2 # Попытка "изменить" a
print(id(a)) # Новый идентификатор, потому что создан новый объект int(7)
# С кортежами:
t = (1, 2, 3)
t = t + (4,) # Создаётся новый кортеж, старый остаётся неизменным
print(t) # (1, 2, 3, 4)Это поведение влияет на несколько аспектов:
def try_to_change(num, text):
num += 10
text = text.upper() # Создаётся новая строка
print("Inside:", num, text)
original_num = 5
original_text = "hi"
try_to_change(original_num, original_text)
print("Outside:", original_num, original_text) # Остались 5 и "hi"Вывод: Понимание работы памяти с неизменяемыми объектами помогает писать более предсказуемый код, избегать скрытых ошибок и эффективнее использовать ресурсы. Это знание особенно важно при работе с многопоточностью (где неизменяемые объекты по умолчанию потокобезопасны) и при оптимизации производительности приложений.