Python IndexError: list index out of range hatası, bir listenin sahip olmadığı indeks numarasıyla elemana erişmeye çalıştığında oluşur. Python’da indeksler 0’dan başladığı için ilk elemanın indeksi 0’dır; son geçerli indeks ise her zaman len(liste) - 1 değeridir.
Bu nedenle hatayı çözmek için önce listenin gerçekten kaç eleman içerdiğini ve kullandığın indeksin bu sınırlar içinde olup olmadığını kontrol etmelisin. Boş listelerde ise erişilebilecek hiçbir geçerli indeks bulunmaz.
IndexError: list index out of range ne anlama gelir?
Bir listenin uzunluğu 3 ise geçerli indeksler 0, 1 ve 2 olur. İlk eleman 0. indekste, son eleman ise len(liste) - 1 yani 2. indekstedir.
notlar = [85, 70, 95]
print(notlar[0])
print(notlar[2])
Beklenen çıktı:
85
95
Burada notlar[0] listenin ilk elemanını, notlar[2] ise son elemanını verir. Ancak notlar[3] kullanılırsa hata oluşur:
notlar = [85, 70, 95]
print(notlar[3])
notlar listesinde 3. indeks bulunmadığı için Python beklenen elemanı döndüremez. Listenin uzunluğu 3 olsa da indeksler 0’dan başladığından son geçerli indeks 3 değil, 3 - 1 işleminin sonucu olan 2’dir. Bu satırda beklenen bir not değeri yerine IndexError: list index out of range hatası alınır.
Aynı durum boş listelerde de görülür:
notlar = []
print(notlar[0])
Boş listenin uzunluğu 0’dır. Son geçerli indeks hesabı len(notlar) - 1 ile yapıldığında -1 elde edilir; fakat bu liste içinde erişilebilecek bir eleman olduğu anlamına gelmez. Liste boş olduğu için notlar[0] kullanımı hataya neden olur.
Hata mesajındaki dosya, satır ve ifadeyi nasıl okuyabilirsin?

Traceback çıktısında genellikle önce hatanın hangi dosyada ve hangi satırda oluştuğu gösterilir. Ardından hata üreten kod satırı, en son satırda ise hata türü ve açıklaması yer alır. Örneğin şu yapıyı görebilirsin:
File "notlar.py", line 4, in <module>
print(notlar[indeks])
IndexError: list index out of range
Bu örnekte notlar.py dosya adıdır, line 4 hatanın 4. satırda oluştuğunu belirtir. Hata üreten ifade ise notlar[indeks] kodudur. Son satırdaki IndexError, listenin sınırları dışında bir indekse erişildiğini açıklar.
Hatanın nedenini anlamak için listenin uzunluğunu, kullanılan indeksi ve indeksin geçerli olup olmadığını yazdırabilirsin:
notlar = [85, 70, 95]
indeks = 3
print("Liste uzunluğu:", len(notlar))
print("Kullanılan indeks:", indeks)
print("İndeks geçerli mi?:", 0 <= indeks < len(notlar))
Beklenen çıktı:
Liste uzunluğu: 3
Kullanılan indeks: 3
İndeks geçerli mi?: False
Bu çıktıda indeksin 3, geçerli aralığın ise 0 ile 2 arasında olduğu görülür. Böylece sorunun listenin kendisinden değil, elemana erişirken kullanılan indeks değerinden kaynaklandığını anlayabilirsin.
Dört adımlı teşhis: Hata hangi indeks hesabından çıkıyor?
IndexError: list index out of range gördüğünde hatayı rastgele düzeltmek yerine indeks hesabını adım adım incele. Aşağıdaki akışta aynı ogrenci_notlari listesi üzerinden ilerleyebilirsin.
- Listeyi yazdır.
lendeğerini kontrol et.- İndeks değerini kontrol et.
rangesınırını kontrol et.- Döngü içinde liste değişiyor mu bak.
1. Liste boş mu?
Boş bir listede geçerli bir indeks bulunmaz. Bu nedenle ilk elemanı doğrudan almaya çalışmak risklidir.
ogrenci_notlari = []
print(ogrenci_notlari[0])
Beklenen çıktı: Program IndexError hatası verir; çünkü listenin uzunluğu 0’dır.
Önce listenin boş olup olmadığını kontrol edebilirsin:
ogrenci_notlari = []
if len(ogrenci_notlari) > 0:
print(ogrenci_notlari[0])
else:
print("Listede not bulunmuyor.")
Beklenen çıktı: Listede not bulunmuyor.
2. Son indeks aşıldı mı?
ogrenci_notlari = [65, 80, 90] listesinde üç eleman vardır. İndeksler 0, 1 ve 2 olur. 3 numaralı indeks listenin dışındadır.
ogrenci_notlari = [65, 80, 90]
print(ogrenci_notlari[3])
Beklenen çıktı: IndexError. En büyük geçerli indeks, len(ogrenci_notlari) - 1 değeridir.
ogrenci_notlari = [65, 80, 90]
son_indeks = len(ogrenci_notlari) - 1
print(ogrenci_notlari[son_indeks])
Beklenen çıktı: 90
3. range() sınırı yanlış mı?
range() fonksiyonunun bitiş değeri döngüye dâhil edilmez. Bu nedenle range(len(ogrenci_notlari)), 0’dan 2’ye kadar çalışır; 3 değerini üretmez.
ogrenci_notlari = [65, 80, 90]
for indeks in range(len(ogrenci_notlari) + 1):
print(ogrenci_notlari[indeks])
Beklenen çıktı: 65, 80 ve 90 yazdırıldıktan sonra IndexError oluşur.
Yalnızca ilgili sınırı düzelterek:
for indeks in range(len(ogrenci_notlari)):
print(ogrenci_notlari[indeks])
Beklenen çıktı: Sırasıyla 65, 80 ve 90.
4. Döngü sırasında liste değişiyor mu?
Döngü devam ederken remove() veya pop() kullanmak, elemanların indekslerini kaydırabilir. Bu durum her zaman IndexError üretmez; ancak atlanan elemanlara veya beklenmeyen sonuçlara yol açabilir.
ogrenci_notlari = [65, 80, 90]
for indeks in range(len(ogrenci_notlari)):
ogrenci_notlari.pop(indeks)
print(ogrenci_notlari)
Beklenen çıktı: Liste kısaldığı için bir noktada geçersiz indekse erişme riski oluşur.
Listeyi döngü sırasında değiştirmek yerine güvenli bir kopya üzerinden ilerleyebilirsin:
ogrenci_notlari = [65, 80, 90]
for not_degeri in ogrenci_notlari[:]:
if not_degeri < 70:
ogrenci_notlari.remove(not_degeri)
print(ogrenci_notlari)
Beklenen çıktı: [80, 90]
Güvenli çözüm yöntemleri: range(), enumerate() ve doğrudan dolaşma

İndekse gerçekten ihtiyacın varsa range(len(liste)) kullanabilirsin:
ogrenci_notlari = [65, 80, 90]
for indeks in range(len(ogrenci_notlari)):
print(indeks, ogrenci_notlari[indeks])
Beklenen çıktı: 0 65, 1 80, 2 90.
Hem indeks hem değer gerekiyorsa enumerate() daha okunabilir bir seçimdir:
for indeks, not_degeri in enumerate(ogrenci_notlari):
print(indeks, not_degeri)
Beklenen çıktı: 0 65, 1 80, 2 90.
Yalnızca not değerleri gerekiyorsa indeksi tamamen kaldırabilirsin:
for not_degeri in ogrenci_notlari:
print(not_degeri)
Beklenen çıktı: 65, 80 ve 90.
| Yaklaşım | Ne zaman kullanılır? | Dikkat edilmesi gereken nokta |
|---|---|---|
range(len(liste)) |
İndeks üzerinden işlem yapılacaksa | Bitiş değeri dışlanır; +1 eklemek hata üretebilir. |
enumerate() |
Hem indeks hem değer gerekiyorsa | İndeks yine listenin geçerli sınırları içinde kullanılmalıdır. |
| Doğrudan dolaşma | Yalnızca eleman değerleri gerekiyorsa | Gereksiz indeks hesabından kaçınır. |
Değişken bir indeksle çalışırken erişimi ayrıca güvenceye alabilirsin:
ogrenci_notlari = [65, 80, 90]
indeks = 3
if indeks < len(ogrenci_notlari):
print(ogrenci_notlari[indeks])
else:
print("Geçersiz indeks.")
Beklenen çıktı: Geçersiz indeks. Liste ve indeks mantığını uygulamalı öğrenmek istersen birebir Python yazılım/kodlama kursu sayfasındaki programı inceleyebilirsin.
try-except ne zaman kullanılmalı, ne zaman kullanılmamalı?
try-except, oluşan IndexError hatasını yakalayabilir; ancak indeks hesabındaki mantık hatasını kendiliğinden düzeltmez. Örneğin beş elemanlı bir liste için döngüyü altı kez çalıştırıyorsan ilk çözüm hatayı gizlemek değil, döngü sınırını düzeltmektir.
Çözüm sırasını şöyle düşünebilirsin: İndeks hesabını düzelt → sınırı kontrol et → doğrudan dolaşabiliyorsan indeksi kaldır → gerçekten beklenmeyen erişim ihtiyacı varsa istisnayı anlamlı işle.
İndeks kullanıcıdan veya başka bir dış kaynaktan geliyorsa erişimden önce if kontrolü yapmak çoğu zaman daha açıklayıcıdır:
ogrenci_notlari = [75, 88, 92]
indeks = 4
if 0 <= indeks < len(ogrenci_notlari):
print(ogrenci_notlari[indeks])
else:
print("Bu indekste bir not bulunmuyor.")
Beklenen çıktı:
Bu indekste bir not bulunmuyor.
Bazen erişimin başarısız olma ihtimali program akışının doğal bir parçasıdır ve önceden kontrol edilmesi kolay değildir. Böyle bir durumda try-except kullanılabilir; fakat hata anlaşılır biçimde işlenmelidir:
ogrenci_notlari = [75, 88, 92]
indeks = 4
try:
secilen_not = ogrenci_notlari[indeks]
print("Seçilen not:", secilen_not)
except IndexError:
print("Not okunamadı: Girilen indeks liste sınırlarının dışında.")
Beklenen çıktı:
Not okunamadı: Girilen indeks liste sınırlarının dışında.
Buna karşılık except IndexError: pass yazmak hatayı sessizce yok eder. Program çalışmaya devam etse bile hangi erişimin başarısız olduğunu göremezsin. Bu yaklaşım teşhisi zorlaştırır ve eksik sonuçların fark edilmemesine neden olabilir. Bu yüzden try-except, yanlış range() sınırını veya hatalı indeks hesabını örtmek için kullanılmamalıdır.
IndexError hatasını önlemek için kısa kontrol listesi
- Liste indekslerinin
0’dan başladığını hatırla. - Listenin uzunluğunu
len(liste)ile kontrol et. - Boş olmayan bir listenin son geçerli indeksinin
len(liste) - 1olduğunu doğrula. range()fonksiyonunda üst sınırın döngüye dahil edilmediğini dikkate al.- Listenin boş olabileceği senaryoyu düşün.
- İndeks gerekmiyorsa liste elemanlarını doğrudan dolaş.
- Döngü sırasında aynı listeyi değiştirmek yerine ayrı bir sonuç listesi veya kontrollü bir yöntem kullan.
- Kodu değiştirmeden önce hata mesajındaki satırı, kullanılan indeksi ve listenin uzunluğunu incele.
Bu kontrolleri örneklerle pekiştirmek ve benzer Python hatalarını adım adım incelemek istersen Python video eğitimleri üzerinden düzenli çalışma yapabilirsin.
Şimdi aşağıdaki hatalı döngüyü kontrol listesiyle teşhis et:
ogrenci_notlari = [70, 85, 90]
for i in range(len(ogrenci_notlari) + 1):
print(ogrenci_notlari[i])
Sorun, range() üst sınırına gereksiz yere 1 eklenmesidir. Döngü sonunda i değeri 3 olur; ancak listenin geçerli indeksleri 0, 1 ve 2’dir. Düzeltilmiş kod şöyledir:
ogrenci_notlari = [70, 85, 90]
for i in range(len(ogrenci_notlari)):
print(ogrenci_notlari[i])
Beklenen doğru çıktı:
70
85
90
Sık Sorulan Sorular
Python’da listelerin ilk elemanının indeksi neden 1 değil, 0’dır?
Python listelerinde indeks, başlangıç konumundan uzaklığı ifade eder. İlk eleman başlangıçtan sıfır adım uzakta olduğu için indeksi 0’dır. İkinci elemanın indeksi 1, üçüncü elemanın indeksi ise 2 olur.
len(liste) ile son geçerli indeks arasındaki fark nedir?
len(liste) listedeki eleman sayısını verir. İndeksler sıfırdan başladığı için boş olmayan bir listenin son geçerli indeksi len(liste) - 1 olur. Örneğin uzunluğu 4 olan bir listenin son geçerli indeksi 3’tür.
range(len(liste) + 1) neden IndexError oluşturabilir?
Bu ifade, döngünün len(liste) değerine kadar ulaşmasına neden olur. Oysa len(liste), geçerli bir indeks değildir. Son geçerli indeks bir eksik olduğu için listeye bu değerle erişmeye çalışmak IndexError oluşturabilir.
IndexError hatasında if kontrolü mü, try-except mi tercih edilmelidir?
İndeks sınırını önceden denetleyebiliyorsan if kontrolü veya doğru döngü sınırı tercih edilmelidir. try-except ise erişimin gerçekten beklenmeyen biçimde başarısız olabileceği durumlarda, hatayı anlamlı şekilde işlemek için kullanılmalıdır; mantık hatasını gizlememelidir.
IndexError çözümünde en etkili alışkanlık, hatayı bastırmak yerine kullanılan indeksi, liste uzunluğunu ve döngü sınırını birlikte incelemektir.