Чем отличается изменяемый (mutable) тип данных от неизменяемого (immutable)?
Приведите примеры изменяемых и неизменяемых типов в Python. Что произойдет, если попытаться изменить элемент строки или кортежа? А если попытаться изменить элемент списка?
1 ответ
Изменяемый объект можно править «внутри», не создавая новый; неизменяемый — нельзя, любая «правка» порождает новый объект.
Изменяемые: списки, словари, множества. Неизменяемые: числа, строки, кортежи, bool, None, frozenset.
Что происходит при попытке изменить:
lst = [1, 2, 3]
lst[0] = 99 # можно, список изменился на месте
s = 'кот'
s[0] = 'К' # TypeError: 'str' object does not support item assignment
t = (1, 2, 3)
t[0] = 99 # TypeError: 'tuple' object does not support item assignment
Хитрый случай — кортеж со списком внутри: t = ([1, 2], 3). Сам кортеж неизменяем — заменить t[0] на другой объект нельзя, — но лежащий в нём список править можно: t[0].append(9) сработает. Неизменяемость не проникает вглубь.
Почему это важно: изменяемые объекты передаются в функции по ссылке, и функция может незаметно испортить ваш список. И ключами словаря могут быть только неизменяемые значения (строго говоря — хешируемые).