Koleksiyonlar, değiştirilebilirlik ve referans sezgisi

Nesne tabanlı programlamaya geçmeden önce Python’da birden fazla değeri nasıl tuttuğumuzu ve değişken adlarının bu değerlerle nasıl ilişkilendiğini anlamamız gerekir. Bu hafta liste, demet, sözlük ve kümeleri hızlıca kullanacak; özellikle iki değişkenin aynı değiştirilebilir nesneyi gösterebilmesinin sonuçlarını inceleyeceğiz.

Bu hafta neleri yapabilmelisiniz?

  • list, tuple, dict ve set yapılarını uygun örnekte kullanabilmeli,
  • liste ve demetin mutability farkını açıklayabilmeli,
  • sözlükte anahtar-değer ilişkisini kullanabilmeli,
  • kümenin benzersizlik ve üyelik amacını açıklayabilmeli,
  • aynı nesneye referans verme (aliasing) durumunu fark edebilmeli,
  • is ile == arasındaki fark için ilk sezgiyi oluşturabilmeli,
  • sığ kopya ile aynı nesneyi paylaşma arasındaki farkı gözlemleyebilmelisiniz.

Dört temel koleksiyon

Yapı Temel fikir Değiştirilebilir? Tipik kullanım
list sıralı değerler evet notlar, ürünler, adımlar
tuple sabit sıralı grup hayır koordinat, değişmez kayıt parçası
dict anahtar → değer evet öğrenci no → öğrenci bilgisi
set benzersiz değerler evet üyelik, tekrarları kaldırma

Kümede "python" iki kez yazılsa bile yalnızca bir kez tutulur.

Liste değişir, demet değişmez

Aynı işlemi tuple üzerinde yapmaya çalışmak TypeError üretir:

point = (10, 20)
point[0] = 99  # hata

Buradaki değiştirilemezlik, tuple’ın eleman bağlarının sonradan yeniden atanamaması anlamına gelir. Ancak bir tuple’ın içinde değiştirilebilir bir nesne bulunabilir:

Tuple’ın kendisine yeni bir eleman atamadık; tuple içindeki liste nesnesinin durumunu değiştirdik. Bu ayrım, “immutable” sözcüğünü bütün iç yapının derinlemesine değişmez olduğu şeklinde yorumlamamayı sağlar.

Bu ayrım yalnızca sözdizimi ayrıntısı değildir. Değiştirilebilir nesneler başka yerlerden de aynı referansla erişildiğinde beklenmedik yan etkiler üretebilir.

Demet içindeki değiştirilebilir listenin güncellenmesi: demetin yapısı sabit kalırken içindeki liste değişir.

Kritik deney: iki ad, bir liste

Aşağıdaki kodu çalıştırmadan önce çıktıyı tahmin edin.

second = first yeni bir liste oluşturmaz. İki değişken adı aynı liste nesnesini gösterir.

İki değişkenin aynı ürün nesnesine bağlanması ve bir ad üzerinden yapılan stok değişikliğinin diğer addan da görülmesi.

Bunu id() ile gözlemleyebiliriz:

is, iki ifadenin aynı nesneye gönderme yapıp yapmadığını; == ise değerlerin eşit kabul edilip edilmediğini sorgular.

ImportantBu fikir OOP’nin merkezine gidecek

Gelecek haftalarda account, customer, order gibi değişkenlerin birer nesneyi göstereceğini göreceğiz. Bir nesneyi metotla değiştirdiğimizde, aynı nesneye referansı olan diğer yerler de yeni durumu görür. Bugünkü liste deneyi bunun küçük bir ön gösterimidir.

Eşit ama aynı olmayan iki liste

İçerikleri eşit olabilir ama iki ayrı liste nesnesidir.

Kopya oluşturmak

Yeni ve ayrı bir liste istediğimizde basit bir sığ kopya oluşturabiliriz:

Ancak sığ kopya (shallow copy) ifadesindeki “sığ” sözcüğü önemlidir. İç içe listelerde içteki nesneler hâlâ paylaşılabilir:

Bu hafta deepcopy ayrıntısına girmiyoruz. Ama bir kopyanın neyi gerçekten ayırdığını sorgulama alışkanlığı önemlidir.

Sözlükle kayıt tutmak

Bu yaklaşım küçük veri kayıtlarında kullanışlıdır. Ancak sistem büyüdükçe “stok azaltma” gibi davranışların her yerde doğrudan product["stock"] -= 1 biçiminde yazılması kuralları dağınık hâle getirebilir. OOP’ye geçerken tam olarak bu sorunu ele alacağız: veri ile o veriyi değiştiren davranışı aynı sorumluluk altında toplamak.

Alıştırma — Doğru koleksiyonu seç

Aşağıdaki ihtiyaçlar için list, tuple, dict veya set seçeneklerinden en uygun olanı seçin ve bir cümleyle gerekçelendirin:

  1. Bir dersin haftalık konu sırası.
  2. Öğrenci numarasından öğrenci adına hızlı erişim.
  3. Sisteme giriş yapan benzersiz kullanıcı adları.
  4. Değişmemesi gereken (enlem, boylam) çifti.

Tek bir “mutlak doğru” yerine kullanım amacına bakın.

Alıştırma — Aliasing hatasını düzelt

Aşağıdaki kodda backup değişmeden kalması bekleniyor:

backup için ayrı liste oluşacak biçimde tek satırı değiştirin.

Alıştırma — Frekans sözlüğü

Aşağıdaki kelimelerin kaç kez geçtiğini sözlükte tutun.

counts.get(word, 0) ifadesi anahtar yoksa 0 döndürür.

counts[word] = counts.get(word, 0) + 1

Küçük üretim görevi — Basit envanter

Ürün kodlarını anahtar, stok miktarlarını değer olarak tutan bir sözlük oluşturun. Ardından:

  • bir ürünün stokunu azaltın,
  • olmayan ürün için güvenli kontrol yapın,
  • stoku sıfır olan ürünleri listeleyin,
  • tüm ürün kodlarının benzersiz olduğunu açıklayın.

Son olarak şu soruyu cevaplayın: “Stok sıfırın altına düşmesin” kuralını bu sözlük yaklaşımında nerede koruyoruz? Bu sorunun cevabı, ileride neden sınıf metotlarına ihtiyaç duyacağımızı gösterecek.

Kendinizi kontrol edin

  1. a = b bir listeyi kopyalar mı?
  2. a == b ile a is b hangi farklı soruları sorar?
  3. Bir tuple neden listeye göre daha uygun olabilir?
  4. Bir tuple’ın içinde liste varsa, tuple’ın değiştirilemez olması bu listenin de değiştirilemez olduğu anlamına gelir mi?
  5. Sözlük hangi problemde listeden daha anlamlıdır?
  6. Sığ kopyada iç içe nesneler neden hâlâ paylaşılabilir?

Bu haftadan akılda kalması gerekenler

  • Python koleksiyonları yalnızca veri saklama araçları değil, farklı kullanım amaçları olan nesnelerdir.
  • Değiştirilebilir nesnelerde iki değişken aynı nesneyi gösterebilir.
  • is kimlik, == eşitlik sorusudur.
  • Bir tuple’ın elemanları yeniden atanamaz; ancak içinde tuttuğu mutable nesnelerin durumu değişebilir.
  • Sığ kopya dış koleksiyonu ayırır; içteki nesneler paylaşılabilir.
  • Dağınık sözlük güncellemeleri, ileride sınıf ve metot tasarımının neden gerekli olduğunu gösterecektir.
Back to top