Что-то изменчиво только тогда, когда мы можем изменить значения, хранящиеся в ячейке памяти, без изменения самой ячейки памяти.
Уловка заключается в следующем: если вы обнаружите, что ячейки памяти до и после изменения совпадают, они могут быть изменены.
Например, список изменяемый. Как?
>> 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' не поддерживает назначение элементов
Итак, нам не удалось изменить строку. Это означает, что строка неизменна.
При переназначении вы изменяете переменную, чтобы она указывала на само новое местоположение. Здесь вы не изменили строку, а изменили саму переменную. Вот что вы делаете.
>> a = "hello"
>> id(a)
139767308749440
>> a ="world"
>> id(a)
139767293625808
id
до и после переназначения различаются, поэтому это доказывает, что вы на самом деле не мутируете, а указываете переменную на новое место. Это не изменяет эту строку, а изменяет эту переменную.