Coś jest zmienne tylko wtedy, gdy jesteśmy w stanie zmienić wartości przechowywane w lokalizacji pamięci bez zmiany samej lokalizacji pamięci.
Sztuczka polega na tym, że jeśli okaże się, że lokalizacja pamięci przed i po zmianie jest taka sama, jest zmienna.
Na przykład lista jest zmienna. W jaki sposób?
>> 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.
Ciąg jest niezmienny. Jak to udowodnimy?
> a = "hello"
> a[0]
'h'
# Now let's modify it
> a[0] = 'n'
----------------------------------------------------------------------
dostajemy
TypeError: obiekt „str” nie obsługuje przypisywania pozycji
Więc nie udało nam się zmutować łańcucha. Oznacza to, że ciąg jest niezmienny.
Podczas ponownego przypisywania zmieniasz zmienną, aby wskazywała na nową lokalizację. Tutaj nie zmutowałeś łańcucha, ale zmutowałeś samą zmienną. Oto, co robisz.
>> a = "hello"
>> id(a)
139767308749440
>> a ="world"
>> id(a)
139767293625808
idprzed i po zmianie jest inny, więc to dowodzi, że tak naprawdę nie mutujesz, ale kierujesz zmienną do nowej lokalizacji. Co nie jest mutacją tego ciągu, ale mutacją tej zmiennej.