Я всегда обнаруживал, что наличие двух совершенно разных типов для одной и той же базовой структуры данных (массивов) является неудобным проектом, но на практике это не является реальной проблемой. (У каждого языка есть свои бородавки, включая Python, но это не важно.)
Почему кого-то волнует, что переменная находится в другом месте в памяти, чем когда она была изначально выделена? Весь этот бизнес неизменности в Python, кажется, переоценен.
Это разные вещи. Изменчивость не связана с местом, где она хранится в памяти; это означает, что материал, на который он указывает , не может измениться.
Объекты Python не могут изменить местоположение после того, как они созданы, изменяемы или нет. (Точнее, значение id () не может измениться - то же самое на практике.) Внутреннее хранилище изменяемых объектов может измениться, но это скрытая деталь реализации.
>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167
Это не изменяет ("мутирует") переменную; он создает новую переменную с тем же именем и удаляет старую. Сравните с мутацией:
>>> a = [1,2,3]
>>> id(a)
3084599212L
>>> a[1] = 5
>>> a
[1, 5, 3]
>>> id(a)
3084599212L
Как уже отмечали другие, это позволяет использовать массивы в качестве ключей к словарям и другие структуры данных, требующие неизменности.
Обратите внимание, что ключи для словарей не обязательно должны быть полностью неизменными. Только часть, используемая в качестве ключа, должна быть неизменной; для некоторых целей это важное различие. Например, у вас может быть класс, представляющий пользователя, который сравнивает равенство и хеш по уникальному имени пользователя. Затем вы можете повесить другие изменяемые данные на класс - «пользователь вошел в систему» и т. Д. Поскольку это не влияет на равенство или хэш, можно и совершенно правильно использовать это как ключ в словаре. Это не слишком часто требуется в Python; Я просто указываю на это, поскольку несколько человек утверждали, что ключи должны быть «неизменяемыми», что является лишь частично правильным. Я использовал это много раз с картами и наборами C ++.