Değiştirilebilir ve Değiştirilemez Veri Tipleri hk

Merhaba. Python’da değiştirilebilir ve değiştirilemez veri tipleri konusunda bir soru bırakmak istiyorum. Konu çok temel, farkındayım ancak kafamda yer etmesi için soracağım müsadenizle. Değiştirilebilir veri tipi demek, kendisini değiştirmek istediğimiz zaman tekrar tanımlamak zorunda olmadığımız veri tipi mi demektir? Örneğin:

liste1 = [1,2,3,4]
liste1.append(1)
print(liste1)

Listeyi değiştirmek için, tekrar tanımlamadan ona metod uygulayabildik. Ve metod uygulandıktan sonra da liste1’in ID’sinde bir değişiklik olmadı.

Pekala bir string ifade ise, tanımlandığı andan itibaren bir ID içinde saklanıyor. Yani aslında değişkenin değeri ID olarak saklanıyor. Dolayısıyla o değişkenin değerini değiştirmek istediğimiz zaman, tekrar tanımlamak zorundayız. Değil mi?

Ve son soruyu bırakıyorum:

liste1 = [1,2,3,4]
liste2 = [1,2,3,4]

string1 = 1
string2 = 2

Aynı değerlere sahip iki listenin IDleri farklıyken, aynı değerlere sahip stringlerin idleri neden aynıdır?

Merhaba.

Değişiklikten ve tanımlamaktan kastınıza bağlı ama yüzeysel bir şekilde “evet” cevabı verilebilir sanırım.

Nesneler id içinde saklanmıyor. Nesneler bir id’ye sahipler.

Burada ne demek istediğinizden emin değilim.

Değişkenin sahip olduğu değerin kendisi değiştirelemez olduğu için değişkenin farklı bir değere sahip olmasının tek yolu değişkene yeni bir değer atamak.

Aynı değerlere sahip iki listenin id’leri farklı çünkü ikisi de farklı nesneler.

Verdiğiniz örnekte aynı id’ye sahip string’ler göremiyorum.

1 Beğeni

Kendisini degistirmek ne demek? Baskasini, veya kendisi olmayan bir seyi degistirmek manali midir? Degilse “kendi” kelimesini kaldiralim:

Değiştirilebilir veri tipi demek, değiştirmek istediğimiz zaman tekrar tanımlamak zorunda olmadığımız veri tipi mi demektir?

Tekrar tanimlamak bir cozum, problemin tanimiyla bir alakasi yok. O halde onu da cikartalim:

Değiştirilebilir veri tipi demek, değiştirmek istediğimiz zaman bunu yapabildigimiz veri tipi mi demektir?

Cevap “evet”. Bir verinin degerini degistirebiliyorsak, bu degistirilebilir bir veri tipindedir. Degistiremiyorsak, degistirilmezdir.

Simdi demin atladigimiz, ima ile sorulmus asil soruya donelim:

Degistirilmez veri tipini degistirmek istedigimiz zaman tekrar tanimlamak zorunda miyiz?

Burada degismesini istedigimiz ve tekrar tanimlamak zorunda kalabilecegimiz sey bir degisken. Buraya kadar veri tiplerinden (degiskenlerin tuttuklari degerlerden) bahsediyorduk, burada degiskenlerden bahsetmek zorunda kaldik. Sebebi de, evet: degistirilmez veri tiplerinin degistirilememesi. Bir isim (degisken) uzerinden eristigimiz bir degerin kendisi* degismiyorsa, yapabilecegimiz tek sey ismin baska bir degere erismesini saglamak.

Python obje ID’leri bir implementasyon detayi. Degisiklik olmamasi, olmayacagi anlamina gelmiyor. Olmayacagindan emin olmak icin dilin programciya verdigi garantileri okuman gerekiyor.

Ne denmek istendigini ben de anlamadim.

Bunun uzerinden yukarida gectim ama beni endiselendiren kisim obje ID’leriyle baglanti kurulmus olmasi. Bu ID detayi nereden geldi ve okumasi ne kadar yapildi?

Bunun iki cevabi var. Birincisi: String interning. Fakat sorulari sorus biciminden bu kadar detaya inmeden once biraz daha calisma yapman gerektigini goruyorum. Pointer’lari anlayacak kadar temel C ogrenmeni tavsiye ederim, mesela.

Ikincisi: Neden olmasin? Ayni veya farkli degerlere sahip objelerin ayni veya farkli ID’lere sahip olmalari gerektigini neden dusunuyorsun? Veya gerektigini dusunmuyorsun da neden oyle denk geldiklerini mi merak ettin? (Bunlar ayni kelimeler kullanilarak sorulabilen iki tane bambaska soru.)


*: Simdi “kendisi” lafinin ne manaya geldigini gorduk: Bir degere, bir degisken uzerinden erisiyorsak degisebilecek iki seyimiz var. “Kendisi” ilkini belirtiyor.

1 Beğeni