Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python "NameError: name 'x' is not defined" Hatası Nasıl Çözülür?

python-nameerror-name-x-is-not-defined-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Python NameError hatasının temel nedeni nedir?
  2. 1. Adı doğrula: yazım ve büyük-küçük harf farkını bul
  3. 2. Tanımı ve çalışma sırasını kontrol et
  4. 3. Kapsamı ve çalışma koşullarını incele
  5. NameError'ı try/except ile gizlemek yerine kök nedeni düzelt

Python "NameError: name 'x' is not defined" hatası, Python’ın hata oluşan satırda x adını erişilebilir bir değişken, fonksiyon veya nesne olarak bulamadığını gösterir. Bu nedenle Python, hangi değerin kullanılacağını anlayamaz ve NameError üretir.

Çözüm için üç noktayı kontrol etmelisin: adın doğru yazılması, tanımın kullanımdan önce çalışması ve adın bulunduğu kapsam ile çalışma koşullarının uygun olması. Öğrenci notu hesaplama örneğinde kullanacağımız ogrenci_notu değişkeni, bu üç kontrolü uygulamak için ortak senaryomuz olacak.

Python NameError hatasının temel nedeni nedir?

Python’da bir değişkeni, fonksiyonu veya nesneyi kullanmadan önce onun adını tanımlaman gerekir. Örneğin ogrenci_notu adında bir değişken oluşturup daha sonra aynı adı kullanabilirsin. Ancak değişkeni hiç tanımlamazsan, adını farklı yazarsan ya da tanım satırı henüz çalışmadan kullanırsan Python ilgili adı bulamaz.

NameError: name 'x' is not defined hatasını teşhis ederken şu sırayı izlemek işleri kolaylaştırır:

  1. Adı doğrula: Yazım, alt çizgi kullanımı ve büyük-küçük harfleri karşılaştır.
  2. Tanımı ve çalışma sırasını kontrol et: Değişkenin kullanıldığı satırdan önce gerçekten oluşturulduğundan emin ol.
  3. Kapsamı ve çalışma koşullarını incele: Değişkenin bulunduğu fonksiyon, koşul veya döngü bağlamını kontrol et.

Bu kontroller, hata mesajındaki x yerine kendi kodundaki adı koyarak uygulanabilir. Temel Python kavramlarını ayrıca ölçmek istersen Python bilgi testini çözerek değişken ve hata ayıklama konularındaki seviyeni görebilirsin.

1. Adı doğrula: yazım ve büyük-küçük harf farkını bul

1. Adı doğrula: yazım ve büyük-küçük harf farkını bul

İlk teşhis adımında hata mesajında yazan adı, tanım satırındaki adla karakter karakter karşılaştır. Python büyük ve küçük harfleri farklı kabul eder. Bu nedenle ogrenci_notu, ogrenci_Notu ve ogrenci_not Python açısından üç ayrı addır.

Aşağıdaki örnekte değişken ogrenci_notu adıyla tanımlanıyor, fakat yazdırma satırında ogrenci_Notu kullanılıyor:

ogrenci_notu = 85
print("Öğrencinin notu:", ogrenci_Notu)

Bu kod çalıştırıldığında Python, ogrenci_Notu adında erişilebilir bir değişken bulamaz ve NameError: name 'ogrenci_Notu' is not defined hatasını üretir. Sorun not değerinde değil, tanım ve kullanım sırasında farklı isimlerin yazılmasındadır.

Düzeltmek için aynı adı iki satırda da tutarlı biçimde kullanmalısın:

ogrenci_notu = 85
print("Öğrencinin notu:", ogrenci_notu)

Beklenen çıktı: Öğrencinin notu: 85

Bu kontrolde yalnızca büyük-küçük harfleri değil, eksik veya fazla karakterleri de incele. Bir harfin unutulması, alt çizginin kaldırılması ya da hiç tanımlanmamış başka bir ismin yazılması aynı teşhis başlığı altında değerlendirilir.

2. Tanımı ve çalışma sırasını kontrol et

2. Tanımı ve çalışma sırasını kontrol et

Python kodu, satırları çalışma sırasına göre yürütür. Bir adı kullanmadan önce o adın değer almasını sağlayan atama satırı gerçekten çalışmış olmalıdır.

print(f"Öğrencinin notu: {ogrenci_notu}")
ogrenci_notu = 85

Bu örnekte print satırı önce çalıştığı için Python, ogrenci_notu adını henüz bulamaz ve NameError oluşur.

ogrenci_notu = 85
print(f"Öğrencinin notu: {ogrenci_notu}")

Düzeltilmiş örnekte değer önce atanır, sonra kullanılır. Beklenen çıktı Öğrencinin notu: 85 olur. Bu nedenle hata ayıklarken adın kaynak kodda yazılı olup olmadığına değil, ilgili atama satırının kullanım satırından önce çalışıp çalışmadığına bak.

3. Kapsamı ve çalışma koşullarını incele

Fonksiyonlar kendi yerel kapsamlarını oluşturur. Fonksiyon içinde atanan ogrenci_notu adı kendiliğinden dışarıdaki global ya da modül kapsamına taşınmaz.

def notu_hesapla():
    ogrenci_notu = 80

notu_hesapla()
print(f"Öğrencinin notu: {ogrenci_notu}")

Fonksiyon çağrılmış olsa da değişken yalnızca fonksiyonun içinde tanımlıdır. Dışarıdaki print satırı bu adı bulamadığı için NameError verir. Değeri dışarı aktarmak için return kullanıp sonucu dışarıda bir ada atayabilirsin.

def notu_hesapla():
    ogrenci_notu = 80
    return ogrenci_notu

ogrenci_notu = notu_hesapla()
print(f"Öğrencinin notu: {ogrenci_notu}")

Bu kodun çıktısı Öğrencinin notu: 80 olur. Fonksiyon içinde aynı ada atama yapılmıyorsa dış kapsamda bulunan bir ad okunabilir. Ancak fonksiyon içinde yeni bir atama yapmak, o adı yerel kabul ettirir; bu durum global değeri kendiliğinden değiştirmez.

if ve for blokları tek başına ayrı kapsam oluşturmaz. Fakat bu blokların içindeki atama hiç çalışmazsa ad yine tanımsız kalabilir.

geçti_mi = False

if geçti_mi:
    ogrenci_notu = 85

print(f"Öğrencinin notu: {ogrenci_notu}")

Koşul karşılanmadığı için atama yapılmaz ve NameError oluşur. Her dalda değer atamak sorunu önler:

geçti_mi = False

if geçti_mi:
    ogrenci_notu = 85
else:
    ogrenci_notu = 0

print(f"Öğrencinin notu: {ogrenci_notu}")

Beklenen çıktı Öğrencinin notu: 0 olur. Benzer şekilde boş bir liste, for döngüsünün hiç çalışmamasına neden olabilir.

notlar = []
for not_degeri in notlar:
    ogrenci_notu = not_degeri

print(f"Öğrencinin notu: {ogrenci_notu}")

Bu kodda da NameError oluşur. Başlangıç değeri vermek, boş liste durumunu hesaba katar:

notlar = []
ogrenci_notu = 0

for not_degeri in notlar:
    ogrenci_notu = not_degeri

print(f"Öğrencinin notu: {ogrenci_notu}")

Çıktı Öğrencinin notu: 0 olur. Teşhis sırasında kapsamı, atamanın hangi blokta bulunduğunu ve o kod yolunun gerçekten çalışıp çalışmadığını birlikte kontrol et.

NameError'ı try/except ile gizlemek yerine kök nedeni düzelt

try/except NameError, tanımlanmamış bir adı oluşturmaz. Yalnızca hata oluştuktan sonra istisnayı yakalar. Örneğin aşağıdaki kod, ogrenci_notu tanımlanmadığı hâlde çalışır gibi görünür:

try:
    print(ogrenci_notu)
except NameError:
    print("Öğrenci notu henüz hazır değil.")

Beklenen çıktı: Öğrenci notu henüz hazır değil.

Bu yaklaşım, yazım hatasını veya değişkenin kullanımından sonra tanımlanmasını gizleyebilir. Daha doğru yöntem, değeri önce hesaplamak ve fonksiyondaki yerel değişkeni return ile çağıran kapsama döndürmektir:

def not_hesapla(vize, final):
    ogrenci_notu = vize * 0.4 + final * 0.6
    return ogrenci_notu

ogrenci_notu = not_hesapla(70, 80)
print(ogrenci_notu)

Beklenen çıktı: 76.0. Böylece fonksiyon içindeki yerel ogrenci_notu değeri dışarıda kullanılmak üzere açıkça döndürülür.

Kısa teşhis kontrol listesi

  • Adın yazımını ve büyük-küçük harf farkını kontrol et.
  • Tanımın, kullanım satırından önce gerçekten çalıştığından emin ol.
  • Fonksiyonun yerel kapsamındaki değeri dışarıda kullanacaksan return ile döndür.
  • if dalının veya for döngüsünün gerçekten çalıştığını kontrol et. Bu bloklar tek başına ayrı kapsam oluşturmaz, ancak atamayı yapan kodun çalışmasını engelleyebilir.
  • try/except kullanımının kök nedeni gizleyip gizlemediğini değerlendir.

Değişken tanımlama ve kapsam temellerini pekiştirmek için ücretsiz Sıfırdan Temel Python video eğitimi yararlı bir başlangıç kaynağı olabilir.

NameError'ı yalnızca susturmak yerine adın nerede, ne zaman ve hangi kapsamda oluşturulduğunu bulduğunda, benzer hataları daha hızlı çözebilirsin.

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