İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

Python “‘int’ object is not subscriptable” Hatası Nasıl Çözülür?

python-int-object-is-not-subscriptable-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. “Subscriptable” ne demektir ve bu hata neden oluşur?
  2. sayi[0] neden çalışmaz ve traceback nasıl okunur?
  3. Döngülerde değişken türü nasıl yanlışlıkla değişir?
  4. Basamak toplamı programı nasıl düzeltilir?
  5. Bu hatayı önlemek için hangi kontroller yapılmalı?

Python 'int' object is not subscriptable hatası, bir int değerinden köşeli parantezle eleman seçmeye çalıştığında oluşur. Çözüm, değişkenin gerçekten hangi türde olduğunu kontrol etmek ve sayıyı karakterlerine ayırmak istiyorsan önce uygun bir veri yapısına dönüştürmektir.

Bu hatayı anlamak için önce “subscriptable” kavramını, ardından sayi[0] ifadesinin neden çalışmadığını incelemek gerekir.

“Subscriptable” ne demektir ve bu hata neden oluşur?

“Subscriptable”, bir değere köşeli parantez kullanarak erişilebilmesi anlamına gelir. Python’da tür, bir değerin hangi veri kategorisine ait olduğunu belirtir. Örneğin int tam sayıları, str metinleri, list ise sıralı değerleri temsil eder.

İndeks, bir dizi veya metin içindeki konumu belirten sayıdır ve sayma işlemi genellikle sıfırdan başlar. Bu nedenle "Python"[0] ifadesi metnin ilk karakteri olan "P" değerini verir. Köşeli parantez kullanımı her tür için aynı anlama gelmez. Sözlüklerde indeks yerine anahtar aranır.

Tür Köşeli parantezle erişim Örnek kullanım
Liste İndeks sayilar[0]
Metin İndeks "472"[0]
Tuple İndeks (10, 20)[1]
Sözlük Anahtar {"ad": "Ada"}["ad"]
int veya float Doğrudan erişim desteklenmez sayi[0]

Liste, metin ve tuple birden fazla elemana sahip sıralı yapılardır. Bu yüzden içlerindeki belirli konumlara indeksle ulaşabilirsin. Sözlükte ise ["ad"] ifadesi sıfırıncı elemana gitmez, "ad" anahtarına karşılık gelen değeri arar.

int ve float değerler tek bir sayısal değer olarak tutulur. Örneğin 472 sayısı Python tarafından otomatik olarak "4", "7" ve "2" karakterlerinden oluşan bir metin gibi saklanmaz. Bu nedenle aşağıdaki kodda köşeli parantez kullanımı hata üretir:

sayi = 472
ilk = sayi[0]
print(ilk)

Burada Python, int türündeki sayi değerinden sıfırıncı indeksi istemektedir. Ancak bu tür, indekslenebilir elemanlar sunmadığı için TypeError oluşur.

sayi[0] neden çalışmaz ve traceback nasıl okunur?

sayi[0] neden çalışmaz ve traceback nasıl okunur?

sayi[0] ifadesi sayının ilk basamağına ulaşmaz; çünkü sayi değişkeni bir metin ya da liste değil, tek bir int değeridir. Sayının basamaklarına karakter gibi erişmek istiyorsan onu önce metne dönüştürmen veya basamak hesabını matematiksel işlemlerle yapman gerekir.

input() ile alınan değer başlangıçta metin türündedir. int() uygulandığında aynı değer tam sayıya dönüşür. Tür farkını görmek için şu kodu çalıştırabilirsin:

girdi_metni = input("Sayı: ")
print(type(girdi_metni).__name__)

sayi = int(girdi_metni)
print(type(sayi).__name__)

Bu kodda 472 girilirse ekranda önce str, sonra int görünür. str metin olduğu için girdi_metni[0] kullanılabilir; sayi tam sayı olduğu için sayi[0] kullanılamaz. Değişken adlarını girdi_metni ve sayi gibi ayırmak, dönüşümden sonra hangi değeri kullandığını takip etmeyi kolaylaştırır.

Traceback, hatanın oluştuğu satırı ve o satıra ulaşılırken izlenen çağrı yolunu gösteren hata raporudur. Örneğin yukarıdaki hatada raporun sonunda şu bölüme benzer bir ifade görürsün:

Traceback (most recent call last):
  File "ornek.py", line 2, in <module>
    ilk = sayi[0]
TypeError: 'int' object is not subscriptable

Traceback okurken önce dosya adını ve satır numarasını bul, ardından o satırdaki ifadeyi incele. En alttaki satır hata türünü ve kısa açıklamasını verir. Bu örnekte TypeError, işlemin veri türüyle uyumsuz olduğunu; 'int' object is not subscriptable bölümü ise tam sayı üzerinde köşeli parantezle erişim yapılamadığını anlatır.

Teşhisi doğrulamak için değişkenin gerçek türünü yazdırabilirsin:

print(type(sayi))
print(type(sayi).__name__)

Bir fonksiyonun döndürdüğü değeri de varsaymadan kontrol etmek gerekir. Örneğin sonuc = fonksiyon() sonrasında type(sonuc).__name__ ifadesini yazdırarak fonksiyonun metin, liste ya da tam sayı döndürdüğünü görebilirsin. Hata metninin görünümü Python sürümüne veya çalıştırma ortamına göre küçük ayrıntılarla değişebilir; dosya, satır ve temel hata türü aynı teşhis için yeterlidir.

Döngülerde değişken türü nasıl yanlışlıkla değişir?

Döngülerde değişken türü nasıl yanlışlıkla değişir?

Döngülerde aynı değişken adını hem liste hem de sayı için kullanmak, listenin üzerine yeni bir int değerinin yazılmasına yol açabilir. Tür, bir değerin Python tarafından nasıl ele alındığını gösterir. İndeks ise liste içindeki konumu belirtir.

sayilar = [10, 20, 30]

for sayilar in range(3):
    pass

print(sayilar[0])

Bu örnekte döngü başlamadan önce sayilar bir listedir. Ancak döngü her turda aynı ada bir sayı atar ve son turdan sonra sayilar değeri 2 olur. Hata, print(sayilar[0]) satırında oluşur; çünkü Python burada listenin ilk elemanını değil, bir sayının ilk elemanını bulmaya çalışır.

Değişken adlarını görevlerine göre ayırmak, bu karışıklığı önler:

sayilar = [10, 20, 30]

for indeks in range(len(sayilar)):
    gecici = sayilar[indeks]
    print(gecici)

Bu kodun çıktısı sırasıyla 10, 20 ve 30 olur. sayilar listeyi, indeks konumu, gecici ise o konumdaki değeri temsil eder.

Benzer bir sorun fonksiyonun beklenen türden farklı bir değer döndürmesiyle de ortaya çıkabilir:

def listeyi_getir():
    sayilar = [10, 20, 30]
    return sayilar[0]

sonuc = listeyi_getir()
print(type(sonuc))
print(sonuc[0])

type(sonuc) çıktısı <class 'int'> olur. Fonksiyonun adı ve kullanım biçimi bir liste beklentisi oluştururken return sayilar[0] yalnızca tek bir sayı döndürür. Liste döndürülmesi gerekiyorsa bu satır return sayilar olarak incelenmelidir.

Traceback, Python’ın hataya giderken izlediği çağrı ve satır bilgilerini gösteren bölümdür. Bu tür bir hatayı teşhis ederken şu sırayı kullanabilirsin:

  1. Traceback içindeki son dosya ve satır bilgisini bul.
  2. Hata satırındaki değişkenin son atamasını geriye doğru izle.
  3. Değişkenin türünü type(degisken) ile kontrol et.
  4. Bulduğun türü, o satırın beklediği türle karşılaştır.
  5. Değer bir fonksiyondan geliyorsa fonksiyonun return satırını incele.

Basamak toplamı programı nasıl düzeltilir?

Basamak toplamında sayı int olarak alındığında, sayi[0] biçimindeki indeksleme çalışmaz. Hatalı yaklaşımda Python, aşağıdaki kodda toplam = ifadesinin devamındaki ilk sayi[0] kullanımında durur:

sayi = int(input("Bir sayı: "))

toplam = (
    int(sayi[0]) + int(sayi[1]) +
    int(sayi[2]) + int(sayi[3])
)

print(toplam)

Sayıyı metne çevirerek karakterler üzerinde dolaşabilirsin. str(sayi)[0] ifadesi, sayının metin hâlinin ilk karakterine erişir. Döngüdeki her karakteri int() ile basamağa dönüştürmek gerekir.

sayi = int(input("Bir sayı: "))
toplam = 0

for karakter in str(sayi):
    toplam += int(karakter)

print(toplam)

Girdi olarak 1234 verildiğinde bu programın çıktısı 10 olur. Girdi 0 olduğunda str(0) değeri "0" olur ve sonuç yine 0 çıkar.

Diğer yöntemde sayı metne çevrilmez. % 10 işlemi son basamağı verir, // 10 işlemi ise pozitif tam sayının son basamağını attıktan sonra kalan bölümü üretir.

sayi = int(input("Bir sayı: "))
toplam = 0

while sayi > 0:
    toplam += sayi % 10
    sayi //= 10

print(toplam)

1234 girdisi için bu çözüm de 10 çıktısını üretir. 0 girdisinde döngüye girilmez ve başlangıç değeri olan 0 yazdırılır. Hata mesajının yazımı Python 3 sürümüne göre küçük farklılıklar gösterebilir, ancak sorunun kaynağını anlamak için hata satırındaki türü ve kullanılan işlemi karşılaştırmak yeterlidir.

Bu hatayı önlemek için hangi kontroller yapılmalı?

Bu hatayı önlemenin temel yolu, her değişkenin hangi tür değeri taşıdığını ve kod içinde hangi amaçla kullanıldığını açık tutmaktır. Bir değişkenin metin, liste, tuple, sözlük, int ya da float olarak kullanılması, köşeli parantezle erişimin çalışıp çalışmayacağını doğrudan etkiler.

  • input() sonrasındaki kararı ver: Değeri karakterlerine ayırarak inceleyeceksen metin olarak bırakabilirsin. Aritmetik işlem yapacaksan int() veya uygun başka bir sayısal türe dönüştürmen gerekir.
  • Basamaklara nasıl erişeceğini seç: Sayıyı metin olarak ele alıp karakterlerine erişebilir ya da basamakları % ve // işlemleriyle matematiksel olarak ayırabilirsin. Bu iki yaklaşımı aynı değişkenin türünü belirsiz bırakacak şekilde karıştırma.
  • Değişken adlarını görevlerine göre ayır: Aynı adı önce liste, sonra sayaç veya sayı için kullanma. sayilar, sayac ve toplam gibi adlar, kodun hangi değeri taşıdığını izlemeyi kolaylaştırır.
  • Fonksiyonun döndürdüğü değeri kontrol et: Bir fonksiyonun liste döndürmesini beklerken return ile sayı veya başka bir değer dönüp dönmediğini incele. Gerekirse sonucu ayrı bir değişkene atayıp türünü kontrol et.
  • Hata alınan satırı incele: Köşeli parantezden önceki değişkenin gerçekten indekslenebilir bir değer taşıyıp taşımadığını kontrol et. Şüphe varsa print(type(deger)) yazarak türü doğrudan görebilirsin.

Kısa karar akışı

  1. Değer gerçekten liste, metin, tuple veya sözlük mü; yoksa int ya da float mı?
  2. İndeks veya anahtar kullanıyorsan, ilgili veri yapısının buna izin verip vermediğini kontrol et.
  3. Değer sayıysa, basamak ya da karakter erişimi yerine metne dönüştürme veya matematiksel ayırma yöntemlerinden birini seç.
  4. Fonksiyon çağrısından sonra dönen değerin türünü ve değişkenin son atamasını yeniden incele.

Bu adımlar, hatayı yalnızca düzeltmeye değil, değişken türlerini kod boyunca daha kolay takip etmeye de yardımcı olur.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara