Liste mi Tuple mı? Python'da Değişen Koleksiyon ile Sabit Kaydın Farkı
Liste ile tuple ilk bakışta aynı işi yapar: sıralı değerleri tutarlar. Asıl fark, birinin yerinde değiştirilebilmesi, diğerinin ise oluşturulduğu anda sabitlenmesidir; bu tek özellik sözlük anahtarından fonksiyon dönüşüne kadar pek çok tasarım kararını belirler.
Bir bakışta
- Liste yerinde değişir, tuple oluşturulduğu anda sabitlenir. Tuple'ın bir öğesine atama yapmak TypeError ile sonuçlanır.
- Liste aynı türden öğelerin koleksiyonu, tuple ise farklı parçalardan oluşan bir kayıttır. Python belgeleri bu ayrımı tipik kullanım olarak tanımlar.
- Sözlük anahtarı ya da küme elemanı gerekiyorsa tuple kullanılır. Değiştirilemeyen diziler hash desteği taşır; listeler taşımaz.
- Tuple'ı tuple yapan parantez değil virgüldür. Tek öğeli tuple için sondaki virgül unutulursa elinizde düz bir değer kalır.
- Tuple'ın değişmezliği yüzeyseldir. İçindeki bir liste hâlâ değiştirilebilir; bu durumda tuple hash'lenemez.
Ortak zemin: ikisi de sıralı dizi
Python'da liste ve tuple, öğeleri sıralı tutan iki standart dizi türüdür. İkisi de dizinlemeyi, dilimlemeyi, üyelik kontrolünü (in), uzunluk ölçmeyi (len) ve döngüyle gezmeyi destekler. Python belgelerine göre tuple, ortak dizi işlemlerinin tamamını uygular.
Yazımları farklıdır: renkler = ["kırmızı", "mavi"] konum = ("İstanbul", "Kadıköy")
Birbirine dönüştürmek de kolaydır: list(konum) yeni bir liste, tuple(renkler) yeni bir tuple üretir. Bu yüzden seçim bir kez yapılıp sonsuza kadar sürdürülmek zorunda değildir; ama verinin anlamını doğru yansıtan tür kodu okunur ve güvenli kılar.
Ölçüt ölçüt farklar
- Ölçüt: Değiştirilebilirlik. Liste: öğe eklenir, silinir, yerinde değiştirilir. / Tuple: oluşturulduktan sonra öğelerine atama yapılamaz.
- Ölçüt: Tipik kullanım. Liste: aynı türden öğelerin koleksiyonu, genellikle döngüyle gezilir. / Tuple: farklı türden parçaların oluşturduğu kayıt, genellikle paket açma ya da dizinle okunur.
- Ölçüt: Metotlar. Liste: append, extend, insert, remove, pop, sort, reverse gibi değiştiren metotlar. / Tuple: yalnız değiştirmeyen işlemler; değiştiren metotların hiçbiri yoktur.
- Ölçüt: Sözlük anahtarı ve küme elemanı. Liste: olamaz, çünkü hash'lenemez. / Tuple: olabilir, yeter ki içindeki her öğe de hash'lenebilir olsun.
- Ölçüt: Yazım. Liste: köşeli parantez. / Tuple: virgül; parantez çoğu zaman yalnız okunurluk için konur.
Python belgeleri ayrımı açıkça yapar: tuple'lar genellikle farklı türden öğelerden oluşan bir diziyi tutar ve bu öğelere paket açma ya da dizinle erişilir; listeler ise genellikle aynı türden öğeler içerir ve döngüyle gezilir.
Temel fark değiştirilebilirlik; gerisi bundan doğar
| Liste (list) | Tuple | |
|---|---|---|
| Değiştirilebilirlik | Yerinde değişir | Oluşturulduğu anda sabitlenir |
| Tipik içerik | Aynı türden öğeler koleksiyonu | Farklı parçalardan oluşan kayıt |
| Erişim biçimi | Döngüyle gezme | Paket açma ya da dizin |
| Değiştiren metotlar | append, extend, sort, pop… | Yok |
| Sözlük anahtarı | Olamaz | Olabilir (öğeleri hash'lenebilirse) |
Değiştirilebilirlik kodda nasıl görünür?
Listeye öğe eklemek ve sıralamak yerinde yapılır: renkler.append("yeşil") renkler.sort()
sort metodu listeyi yerinde sıralar ve None döndürür; yeni bir sıralı liste gerekiyorsa sorted(renkler) kullanılır. Bu, yeni başlayanların sık düştüğü bir tuzaktır: renkler = renkler.sort() satırı listeyi None ile değiştirir.
Tuple'da aynı girişim hata verir: konum.append("Moda") sonucu AttributeError Bir öğeye dizinle yeni değer atamaya çalışmak ise TypeError verir: 'tuple' object does not support item assignment
Tuple'ı "değiştirmek" için yeni bir tuple oluşturulur: konum = konum + ("Moda",). Değişken artık başka bir nesneyi gösterir; eski tuple aynen kalır. Bu davranış, bir değerin farkında olmadan başka bir yerde değiştirilmesini engeller.
Sözlük anahtarı, küme ve hash'lenebilirlik
Python belgelerine göre değiştirilemeyen dizilerin değiştirilebilir olanlardan ayrıldığı tek genel işlem hash() desteğidir. Bu destek sayesinde tuple'lar sözlük anahtarı olarak kullanılabilir ve kümelerde saklanabilir.
Gerçek bir örnek: iki şehir arasındaki güzergâh türünü tutan bir sözlük. guzergah = {("Ankara", "İzmir"): "otoyol", ("Ankara", "Sinop"): "devlet yolu"} guzergah[("Ankara", "İzmir")] ifadesi "otoyol" döndürür. Aynı anahtarı liste ile yazmak TypeError: unhashable type: 'list' hatası verir.
Sınır şudur: tuple ancak içindeki tüm öğeler hash'lenebilirse hash'lenebilir. Belgelerin sözlük bölümü bunu açıkça yazar: doğrudan ya da dolaylı olarak değiştirilebilir bir nesne içeren tuple anahtar olarak kullanılamaz. ("Ankara", ["Çankaya"]) gibi içinde liste taşıyan bir tuple oluşturulabilir, ama sözlük anahtarı olamaz.
Örnek: ikisi aynı betikte birlikte
Bir müşteri dosyasını csv.DictReader ile okuyan bir betik düşünün; koddaki okuyucu değişkeni bu nesnedir. Her satır ad, şehir ve segment bilgisinden oluşan sabit bir kayıttır; bu kayıt tuple olarak tutulur. Okunan kayıtların tamamı ise sayısı dosyaya göre değişen bir koleksiyondur; bu da liste olarak tutulur: musteriler = [] for satir in okuyucu: musteriler.append((satir["ad"], satir["sehir"], satir["segment"]))
Ardından şehir ve segment ikilisine göre müşteri gruplamak için sözlük kurulur. Anahtar burada da tuple'dır, çünkü iki alanın birlikte oluşturduğu sabit bir bileşik değerdir: gruplar = {} for ad, sehir, segment in musteriler: gruplar.setdefault((sehir, segment), []).append(ad)
Döngüdeki for ad, sehir, segment in musteriler satırı, her tuple'ı paket açarak okur. Sözlüğün değerleri ise liste olarak kalır, çünkü her gruba yeni adlar eklenir. Aynı kodda her tür kendi rolündedir: sabit kayıt tuple, büyüyen koleksiyon liste.
Hangi durumda hangisi?
Liste seçin: • Öğe sayısı çalışma sırasında değişecekse: okunan satırlar, filtrelenen kayıtlar, kuyruktaki işler. • Öğelerin hepsi aynı anlamı taşıyorsa ve üzerlerinde döngüyle aynı işlem yapılacaksa. • Sıralama, ekleme ve silme gibi yerinde işlemler gerekiyorsa.
Tuple seçin: • Her konumun ayrı bir anlamı olan sabit bir kayıt tutuyorsanız: ad ve soyad, il ve ilçe, enlem ve boylam. • Fonksiyondan birden fazla değer döndürüyorsanız: return ortalama, sapma ifadesi aslında bir tuple döndürür ve çağıran taraf bunu paket açarak alır. • Değer sözlük anahtarı ya da küme elemanı olacaksa. • Verinin kazara değiştirilmesini önlemek istiyorsanız; örneğin modül düzeyindeki sabit seçenek listeleri.
Kayıttaki alanlara adla erişmek okunurluğu artıracaksa, Python belgeleri düz tuple yerine collections.namedtuple kullanmayı önerir: nokta.x yazımı, dizinle erişimden daha açıktır.
Performans farkı çoğu uygulamada belirleyici değildir. Seçimi verinin anlamı ve değiştirilip değiştirilmeyeceği belirler.
Sık yapılan hatalar
- Tek öğeli tuple'da virgülü unutmak. ("elma") yazımı bir tuple değil, parantez içindeki bir metindir. Belgelerin vurguladığı gibi tuple'ı yapan virgüldür: ("elma",). Boş tuple ise () ile yazılır.
- Listeyi sözlük anahtarı yapmaya çalışmak. Bileşik anahtar gerekiyorsa tuple kullanılır.
- Tuple'ın içindeki değiştirilebilir nesneyi unutmak. (["a"], ["b"]) tuple'ında tuple'ın kendisi değişmez, ama içindeki listeler değişebilir. Değişmezlik beklentisiyle yazılmış kod burada yanılır.
- Sabit kayıtları liste olarak taşımak. Bir fonksiyona [ad, soyad] listesi göndermek, alıcı tarafın listeye öğe eklemesine ya da sırayı bozmasına izin verir.
- sort metodunun dönüş değerini kullanmak. Liste yerinde sıralanır, dönüş değeri None'dur.
Küçük yazım farkları, farklı nesneler
Mindset programlarında nerede çalışılır?
Liste ve tuple ayrımı, Python ile ilk betiklerini yazan analistlerin ve veri bilimine geçen ekiplerin en erken karşılaştığı tasarım kararlarından biridir. Python ile Programlama Eğitimi temel veri tipleri ve veri yapılarını fonksiyonlar ve döngülerle birlikte işler. Data Science Bootcamp ise veri yapılarını veri edinimi ve dosyalarla çalışma adımlarına bağlayarak analiz akışının içinde kullandırır.
İlgili Mindset programı
Python ile Programlama Eğitimi
Sık sorulan sorular
Tuple listeden daha mı hızlıdır?
Tuple sabit olduğu için bazı işlemlerde küçük farklar ölçülebilir, ancak bu farklar çoğu iş uygulamasında belirleyici değildir. Gerçek bir darboğaz varsa önce ölçüm yapılmalıdır; çoğu zaman yavaşlığın kaynağı veri yapısı seçimi değil, döngü içinde tekrarlanan gereksiz işler ya da yanlış algoritmadır. Seçimi değiştirilebilirlik ihtiyacına göre yapmak daha sağlıklıdır.
Tuple'a öğe eklemenin bir yolu var mı?
Var olan tuple değiştirilemez, ama birleştirme ile yeni bir tuple oluşturulabilir: yeni = eski + ("öğe",). Sık ekleme gerekiyorsa veri aslında bir koleksiyondur ve liste olarak tutulmalıdır. İşlem bitince list ile çalışıp sonunda tuple(liste) ile sabitlemek de yaygın bir yoldur.
namedtuple ile dataclass arasında nasıl seçim yapılır?
namedtuple, alanlarına adla erişilebilen ama tuple gibi değiştirilemeyen hafif bir kayıt üretir ve tuple'ın paket açma, karşılaştırma ve sözlük anahtarı olma özelliklerini korur. dataclass ise varsayılan olarak değiştirilebilir bir sınıf üretir; varsayılan değerler, doğrulama ve metotlar eklemek daha rahattır. Sabit, küçük kayıtlar için namedtuple, davranış taşıyan nesneler için dataclass uygundur.
Fonksiyon parametresi olarak liste mi tuple mı vermek daha güvenli?
Fonksiyonun veriyi değiştirmemesi gerekiyorsa tuple göndermek bu beklentiyi kodla güvenceye alır. Liste gönderildiğinde fonksiyon içinde yapılan append ya da sort çağrıları, çağıran taraftaki listeyi de değiştirir, çünkü ikisi aynı nesneyi gösterir. Liste göndermek zorundaysanız ve fonksiyon değişiklik yapacaksa, fonksiyon içinde list(girdi) ile kopya almak sürprizleri önler.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme