Что-то можно изменить только тогда, когда мы можем изменить значения, хранящиеся в памяти, без изменения самой ячейки памяти.
Уловка: Если вы обнаружите, что расположение памяти до и после изменения одинаково, оно изменено.
Например, список изменен. Как?
>> a = ['hello']
>> id(a)
139767295067632
# Now let's modify
#1
>> a[0] = "hello new"
>> a
['hello new']
Now that we have changed "a", let's see the location of a
>> id(a)
139767295067632
so it is the same as before. So we mutated a. So list is mutable.
Строка неизменна. Как мы это докажем?
> a = "hello"
> a[0]
'h'
# Now let's modify it
> a[0] = 'n'
----------------------------------------------------------------------
мы получаем
TypeError: 'str' object does not support item assignment
Таким образом, мы не смогли мутировать строку. Это означает, что строка является неизменной.
При переназначении вы изменяете переменную, указывая на новое местоположение. Здесь вы не мутировали строку, а мутировали сама переменная. Следующее - это то, что вы делаете.
>> a = "hello"
>> id(a)
139767308749440
>> a ="world"
>> id(a)
139767293625808
id
до и после того, как переназначение отличается, так что это доказывает, что вы на самом деле не мутирует, но указывает на переменную в новое место. Что не мутирует эту строку, но мутирует эту переменную.
Сама строка неизменна, но ярлык может меняться. – mitch
Назначение нового значения для существующей переменной вполне допустимо. У Python нет констант. Это не зависит от изменчивости типа данных. –
Возможно, вы захотите взглянуть на функцию 'id()'. 'a' будет иметь другой идентификатор до и после назначения, указывая, что он указывает на разные объекты. Аналогично с кодом, подобным 'b = a', вы обнаружите, что' a' и 'b' будут иметь одинаковый идентификатор, указывая, что они ссылаются на один и тот же объект. – DRH