Python'da listeler (list) değiştirilebilir yapılar, tuple'lar (tuple) ise değiştirilemez.
list ve tuple'ı değiştirmeyi gösteren bir örnek:
lst = [1, 2, 3] lst.append(4) # TAMAM lst[1] = 20 # TAMAM tup = (1, 2, 3) tup[1] = 20 # TypeError
Performans:
Soru: Listeye öğe ekleme işlemleri genellikle neden hızlı (O(1)) bir şekilde gerçekleştirilir, eğer bu bir dizi bağlamında bellek yeniden dağıtımına yol açması gerekiyorsa?
Cevap:
Python, birkaç öğe için "fazladan bellek ayırarak" dinamik diziler uygular. Bu nedenle append genellikle O(1) alır ve bellek yeniden dağıtımı yalnızca yedek bloğun gerçekten tükenmesi durumunda gerçekleşir.
Örnek:
import sys lst = [] for i in range(10): lst.append(i) print(len(lst), sys.getsizeof(lst)) # Bellek boyutu kesinlikle doğrusal olarak artmıyor
Tarihçe
Bir projede sözlük anahtarları için list kullanıldı. Geliştirici, listelerin hash'e yapılamadığını (değiştirilebilirlik) bilmiyordu, bu da "TypeError: unhashable type: 'list'" hatasına yol açtı.
Geliştirici, uzun listeleri sıkça + ile birleştirerek oluşturuyordu. Bu, dizinin ek kopyalarına ve yüksek bellek ile zaman maliyetine yol açıyordu. Döngü içinde append kullanmak veya üreteçler kullanmak daha etkili olurdu.
Bir kayıt sistemi için zaman damgalarını depolamak amacıyla tuple'lar seçildi, değiştirilemez oldukları için daha hızlı olacağı düşünüldü. Ancak, zaman zaman değişiklik yapma ihtiyacı doğdu; bu da sürekli yeni tuple'lar yaratmayı (copy-on-write) gerektirdi ve performansı listelere göre yavaşlattı.