ProgramlamaPython geliştiricisi

Python'da sözlük (dict) nedir, iç yapısı nasıldır ve hangi durumlarda dict tipi standart dışı davranış sergileyebilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Mesele:

Sözlükler (dict) — Python'un temel veri tiplerinden biri olup "anahtar-değer" yapısını temsil eder. Sözlükler Python'un ilk sürümünden beri vardır, ancak içsel uygulamaları ve davranış özellikleri sürekli olarak geliştirilmektedir (örneğin, Python 3.7 ile birlikte eklenme sırası garanti edilmiştir).

Sorun:

Sözlüğün iç yapısını anlamak, etkili kod yazmak için gereklidir. İnterpolasyon türlerinde anahtarlar kullanıldığında, iç içe geçmiş sözlükler kopyalandığında ve standart dışı işlemler yapıldığında hatalar ortaya çıkabilir.

Çözüm:

Sözlük, bir hash tablosu olarak uygulanmıştır, anahtarların hashlenebilir olması gerekmektedir (değişmez). Anahtara göre değere erişim yaklaşık O(1) süreyle çalışır, ancak belirli koşullarda farklılıklar ortaya çıkabilir — örneğin, çakışmalar veya büyük veri hacimleri ile çalışıldığında.

Kod örneği:

person = {'name': 'Alice', 'age': 30} person['city'] = 'Moskova' print(person['name']) # Alice

Anahtar özellikler:

  • Anahtarlar değişmez ve hashlenebilir olmalıdır (örneğin, str, int, değişmez nesneler içermeyen tuple).
  • Python 3.7 ve üstünde, dict elemanların eklenme sırasını korur.
  • dict, arama, toplama ve eşleme için mükemmel bir yapıdadır.

Kandırıcı sorular.

Dict içinde anahtar olarak liste (list) kullanılabilir mi?

Hayır, listeler değişkendir ve hashlenebilir değildir. Liste kullanma girişimi hata verecektir.

d = {} d[[1, 2, 3]] = 'value' # TypeError: hashlenemeyen tür: 'list'

Eşit içerikli iki tuple anahtar olarak kullanılırsa ne olur?

Eğer her iki tuple aynı verileri içeriyorsa ve kendileri değişmezse, eşit kabul edilirler ve sözlükteki anahtarlar aynı olur:

t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'

Kopyalama işlemi sırasında sözlük elemanlarının sırası değişir mi?

Python 3.7 ve üzeri sürümlerde sıra korunur. Daha eski sürümlerde, dolaşım sırası garanti edilmez.

d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']

Yaygın hatalar ve anti-pattemlar

  • Anahtar olarak değişken bir tür kullanmak (örneğin, list veya dict).
  • Kopyalama hataları: basit = operatörü kopya oluşturmaz, aynı nesne üzerinde yeni bir "gösterici" oluşturur.
  • dict.get() kullanımını None kontrolü yapmadan aşırıya kaçmak, eğer değer == None ise beklenmedik hatalara yol açabilir.

Hayattan bir örnek

Negatif durum

Programcılar, anahtar olarak listeleri tutarken, Python'da tuple ve list'in eşdeğer olduğunu düşünerek hata yaparlar. "unhashable type" gibi istisnalar alırlar.

Avantajlar:

Hızla bir şeyleri "kolayca denemek" için her türlü yapıyı kullanabiliriz.

Dezavantajlar:

Çalışma zamanı hataları, veri işleme sırasında hatalar.

Pozitif durum

Anahtar olarak yalnızca değişmez (hashlenebilir) nesneler kullanılır, tuple'lar değişken içermeyecek şekilde tasarlanmıştır.

Avantajlar:

Anahtara göre hızlı arama, yapının güvenilirliği, kolay işlem ve kopyalama.

Dezavantajlar:

Veriler karmaşık olduğunda, yapıyı değişmez forma (örneğin, tuple içinde seri hale getirme) dönüştürmek için ek işleme gerekebilir.