Python ’list’ object is not callable hatası, bir listenin fonksiyon gibi yuvarlak parantezle çağrılması veya bir fonksiyon adının daha sonra listeyle ezilmesi sonucunda oluşur. Liste elemanına erişirken köşeli parantez, fonksiyon çağırırken yuvarlak parantez kullanılır.
Örneğin liste(0) yazıldığında Python, liste değişkeninin çağrılabilir bir fonksiyon olduğunu düşünür. Oysa değişken bir listeyse doğru kullanım liste[0] biçimindedir.
Python neden listeyi fonksiyon gibi çağırır?

Python’da parantez türü, yazdığın ifadenin amacını belirler. Köşeli parantez bir listenin belirli indeksindeki elemana erişmek için kullanılır. Yuvarlak parantez ise bir fonksiyonu çalıştırmak, yani çağırmak anlamına gelir.
| Yazım | Anlam | Kısa örnek |
|---|---|---|
liste[0] |
Listenin ilk elemanına erişir. | [10, 20][0] → 10 |
fonksiyon() |
Fonksiyonu çağırır. | selamla() → Fonksiyon çalışır. |
Liste elemanına erişmek için liste(0) değil, liste[0] yazılır.
Hatanın yaygın kod örnekleri nasıl düzeltilir?
1. Listeyi doğrudan fonksiyon gibi çağırmak
Bu senaryoda hata, aynı ismin yeniden atanmasından değil, listenin yanlış parantezle kullanılmasından kaynaklanır.
liste = [10, 20]
print(liste(0))
liste bir fonksiyon olmadığı için Python şu hatayı verir: TypeError: 'list' object is not callable.
Düzeltilmiş kod:
liste = [10, 20]
print(liste[0])
Beklenen çıktı: 10
2. Fonksiyon adını listeyle yeniden atamak
Buradaki hata, önce fonksiyon olarak tanımlanan toplam adının daha sonra bir listeyle ezilmesinden oluşur.
def toplam():
return 30
toplam = [10, 20]
print(toplam())
Son satırda toplam() çağrıldığında Python artık fonksiyonu değil, listeyi bulur. Bu nedenle hata parantezden çok, aynı ismin yeniden atanmasıyla ilgilidir.
Düzeltilmiş kod:
def toplam():
return 30
sayilar = [10, 20]
print(toplam())
Beklenen çıktı: 30
3. list yerleşik adını değişken olarak kullanmak
list, Python’da liste oluşturmada kullanılabilen yerleşik bir addır. Bu adı değişken olarak kullanmak, yerleşik işlevle değişken arasında isim çakışmasına yol açabilir.
list = [1, 2, 3]
harfler = list("abc")
print(harfler)
Bu örnekte list artık yerleşik işlevi değil, [1, 2, 3] listesini gösterir. Bu nedenle list("abc") ifadesi listeyi fonksiyon gibi çağırmaya çalışır.
Düzeltilmiş kodda liste değişkenine daha açıklayıcı bir ad verilir:
items = [1, 2, 3]
harfler = list("abc")
print(harfler)
Beklenen çıktı: ['a', 'b', 'c']
Traceback ve type() ile kök neden nasıl bulunur?

Bu hatayı çözerken yalnızca hata mesajına bakmak yerine traceback satırını, parantezden önceki ismi ve o ismin veri türünü birlikte incelemek gerekir. Böylece sorunun yanlış sözdizimi mi, isim çakışması mı yoksa daha önce yapılmış bir atama mı olduğu anlaşılır.
- Traceback satırını bul: Dosya ve satır numarasını gösteren bölümde, hatayı tetikleyen ifadeyi belirle. Özellikle parantezden önce hangi ismin bulunduğuna bak.
- Son hata mesajını yorumla:
TypeError: 'list' object is not callablemesajı, bir liste nesnesinin fonksiyon gibi çağrılmaya çalışıldığını söyler. - Veri türünü kontrol et: Parantezden önceki isim için
print(type(liste))çalıştır. Çıktı<class 'list'>ise bu isim bir listedir. - İsmin geçmişini ara: Aynı ismin nerede tanımlandığını ve daha sonra yeniden atanıp atanmadığını kontrol et. Bir fonksiyon adı, sonraki bir satırda listeyle ezilmiş olabilir. Etkileşimli ortamlarda daha önce çalıştırılmış hücreler de bu duruma yol açabilir.
- Amacı belirle: Eleman okumak istiyorsan köşeli parantez, fonksiyon çalıştırmak istiyorsan normal parantez kullanılır.
- Düzeltip yeniden çalıştır: Kodun beklenen çıktıyı üretip üretmediğini kontrol et. Hata devam ederse traceback'teki yeni satırı yeniden incele.
“Liste elemanına erişmek için liste(0) değil, liste[0] yazılır.”
Aşağıdaki iki çıktı, teşhis için birlikte okunmalıdır:
liste = ["Python", "Java"]
print(type(liste))
print(liste[0])
<class 'list'>
Python
type(liste) çıktısı listenin gerçekten bir liste olduğunu, liste[0] çıktısı ise ilk elemana erişimin doğru biçimde yapıldığını gösterir. Traceback aynı değişkenin liste(0) biçiminde kullanıldığını söylüyorsa sorun, listenin fonksiyon gibi çağrılmasıdır. Fonksiyon adıyla liste adı aynı hâle geldiyse, daha önceki atamaları bulup isimleri ayırmak gerekir.
Bu teşhis akışını kendi örneklerinle uyguladıktan sonra temel Python bilginin hangi konularda güçlenmesi gerektiğini görmek için Python bilgi ve seviye testleri sayfasını kullanabilirsin.
Düzeltme sonrası hangi kontroller yapılmalı?
Hata düzeltildikten sonra yalnızca kodun çalışması yeterli değildir. Aynı sorunun farklı bir satırda yeniden oluşmaması için şu üç soruyu cevapla:
- Eleman mı okuyorum? Liste elemanına erişirken
[], fonksiyon çağırırken()kullandım mı? - Çağırdığım isim gerçekten fonksiyon mu?
type()veya gerekirsecallable()ile kontrol ettim mi? Liste ve fonksiyon içinogrencilervehesaplagibi farklı, açıklayıcı isimler seçtim mi? - Çalışma ortamı temiz mi? Traceback'teki satırı yeniden kontrol ettim mi? Etkileşimli ortamda eski bir atamanın kalmadığından emin olmak için ilgili kodu baştan çalıştırdım mı?
Python temellerini daha sistematik ve uygulamalı biçimde çalışmak istersen, birebir Python yazılım kursu sayfası doğal bir sonraki adım olabilir.
Sık Sorulan Sorular
liste[0] kullanınca IndexError alırsam bu hata, 'list' object is not callable hatasıyla aynı mıdır?
Hayır, iki hata farklıdır. IndexError, listede istenen indeksin bulunmadığını gösterir; örneğin boş bir listede liste[0] kullanmak buna yol açabilir. TypeError: 'list' object is not callable ise listenin liste(0) gibi fonksiyon çağrısı biçiminde kullanılmasından kaynaklanır.
Kod doğru göründüğü hâlde fonksiyon adının listeyle ezildiğini nasıl kesinleştirebilirim?
Parantezden önceki ismi print(type(isim)) ve print(callable(isim)) ile kontrol et. Tür list ve sonuç False ise isim artık çağrılabilir bir fonksiyonu göstermiyordur. Ardından kodda ve etkileşimli çalışma ortamındaki önceki satırlarda isim = atamalarını arayarak hangi satırda listenin bu adı devraldığını bulabilirsin.
Traceback, hata mesajı ve veri türünü birlikte okumak, bu hatayı tahmin etmek yerine doğrudan kök nedeninden çözmeni sağlar.