Öncelikle:
http://matkafasi.com/127395/pythonda-degismez-immutable-degisir-mutable-tipler-nelerdir
Python'un veri modelinde immutable (değiştirilemez) ve mutable (değiştirilebilir) tiplerin kullanımları farklı çalışıyor. [3,5,2,8,1]
bir liste ve listeler mutable (değiştirilebilir). Bu yüzden x=[3,5,2,8,1]
deklerasyonunu bize hafızada sırasıyla 3, 5, 2, 8, 1 sayılarına işaret eden bir x nesnesi oluşturuyor. Bir sonraki adımda y=x
deklerasyonu ise x'e eşit bir y nesnesi oluşturuyor. Bu yüzden daha sonra x'te yaptığımız değişikliklerden y de etkileniyor.
Aynısını immutable (değiştirilemez) olan nesneler yapsaydık o zaman x'te yapılan değişikliklerden y etkilenmezdi çünkü değiştirilemez bir nesnede yapılan değişiklikler aslında yeni bir nesne oluşturur. Mesela aşağıdaki kodla a değişkenin id'sini takip edersek değiştiğini görürüz.
a = 1
print(id(a))
a += 2
print(id(a))
Önce hafızada bir değiştirilemez olan 1 sayısına işaret eden bir a değişkeni oluşturduk. Sonra a'ya 2 ekledik, bunu yaparken hafızada 1'i değiştiremeyeceğimiz (çünkü immutable) için biz de a'yı değiştirdik artık 3 işaret etmeye başladı. Bu yüzden id'si de değişti artık a bambaşka bir nesne.
Deklerasyonlardaki bu farkı aynı işlemlerin mutable/immutable nesnelerde uygulandığında aşağıdaki örnekte görebiliriz.
## Immutable (değiştirilebilir) nesnelerle
x = [1, 2, 3]
y = x
x += [4, 5]
print(y)
# [1,2,3,4,5]
## Mutable (değiştirilemez) nesnelerle
x = (1, 2, 3)
y = x
x += (4, 5)
print(y)
# (1,2,3)