Liste mi Tuple mı? Python'da Değişen Koleksiyon ile Sabit Kaydın Farkı
Karşılaştırma

Liste mi Tuple mı? Python'da Değişen Koleksiyon ile Sabit Kaydın Farkı

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

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

  1. Liste yerinde değişir, tuple oluşturulduğu anda sabitlenir. Tuple'ın bir öğesine atama yapmak TypeError ile sonuçlanır.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Şekil 1

Temel fark değiştirilebilirlik; gerisi bundan doğar

Liste (list)Tuple
DeğiştirilebilirlikYerinde değişirOluşturulduğu anda sabitlenir
Tipik içerikAynı türden öğeler koleksiyonuFarklı parçalardan oluşan kayıt
Erişim biçimiDöngüyle gezmePaket açma ya da dizin
Değiştiren metotlarappend, extend, sort, pop…Yok
Sözlük anahtarıOlamazOlabilir (öğeleri hash'lenebilirse)
Kaynak: Python resmî belgelerine dayanan sayfa içeriğiMindset Institute

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.
Şekil 2

Küçük yazım farkları, farklı nesneler

Hatalı
Doğrusu
tek = ("elma") sonuç düz metin
tek = ("elma",) sonuç tuple
anahtar = ["Ankara", "İzmir"] sözlükte TypeError
anahtar = ("Ankara", "İzmir") sözlükte çalışır
renkler = renkler.sort() sonuç None
renkler.sort() ya da yeni = sorted(renkler)
Kaynak: Sayfa içeriği; Python resmî belgeleriMindset Institute

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 sorulanlar

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.

Python'da List ve Tuple Farkı: Hangisi Ne Zaman?