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

Python UnboundLocalError Hatası Nasıl Çözülür?

python-unboundlocalerror-cannot-access-local-variable-x-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. UnboundLocalError neden oluşur ve hata mesajı ne anlatır?
  2. LEGB kuralı Python'ın değişkeni neden yerel gördüğünü açıklar
  3. Sayaç örneğiyle hatalı kodu ve return kullanan çözümü karşılaştır
  4. global, parametre ve return arasında nasıl seçim yapılır?
  5. Sık Sorulan Sorular

Python UnboundLocalError hatası, bir fonksiyonun içinde aynı isimli değişkene atama yapıldığı hâlde bu değişken atanmadan önce okunmaya çalışıldığında oluşur. Python, fonksiyon gövdesindeki atamayı görür ve o adı yerel değişken kabul eder. Bu nedenle dışarıda aynı isimli, değer atanmış bir değişken bulunsa bile önce fonksiyonun yerel alanına bakar.

Çözüm, değişkenin hangi kapsamda yaşadığını netleştirmektir. Değeri fonksiyona parametre olarak verip güncel sonucu return ile döndürmek, çoğu durumda veri akışını daha açık hâle getirir.

UnboundLocalError neden oluşur ve hata mesajı ne anlatır?

Bu hatanın temel nedeni şudur: Fonksiyon içinde x = ... veya x += 1 gibi bir atama varsa Python, x adını o fonksiyona ait yerel değişken olarak yorumlar. Ardından atama satırından önce x okunursa, yerel değişkenin henüz değeri olmadığı için hata oluşur.

x = 10

def puan_goster():
    print(x)
    x += 1

puan_goster()

Bu kodda dışarıdaki x değişkeninin değeri 10'dur. Ancak x += 1 satırı nedeniyle fonksiyon içindeki x yerel kabul edilir. print(x) çalıştığında Python, dışarıdaki 10 değerine değil, henüz değer atanmamış yerel x adına ulaşmaya çalışır.

Hata çoğu güncel çalışma ortamında şu biçimde görünür:

UnboundLocalError: cannot access local variable 'x' where it is not associated with a value
  • UnboundLocalError, fonksiyon veya metot içinde yerel kabul edilen bir değişkene değer bağlanmadan erişildiğini belirtir.
  • cannot access local variable, Python'ın aradığı adın yerel değişken olduğunu anlatır.
  • 'x', soruna yol açan değişken adıdır. Kendi kodunda burada puan, toplam ya da başka bir ad görebilirsin.
  • where it is not associated with a value, bu yerel değişkene erişim anına kadar bir değer atanmadığı anlamına gelir.

Hata metni Python sürümüne göre farklı ifade edilebilir. Örneğin bazı eski çalışma ortamlarında local variable 'x' referenced before assignment biçimi görülebilir. İki mesaj da aynı kapsam sorununa işaret eder: Yerel değişken, değer almadan önce kullanılmaktadır. Python dokümantasyonu da bu hatayı, yerel bir değişkene değer bağlanmadan başvuru yapılması olarak tanımlar.

LEGB kuralı Python'ın değişkeni neden yerel gördüğünü açıklar

Python bir değişken adıyla karşılaştığında kapsamları belirli bir sırayla arar. Bu sıra kısaca LEGB olarak adlandırılır: Local, yani mevcut fonksiyonun içi; Enclosing, yani varsa dıştaki fonksiyon; Global, yani dosya düzeyi; Built-in, yani len() gibi yerleşik adlar.

UnboundLocalError açısından en kritik adım Local alanıdır. Bir fonksiyon içinde herhangi bir yerde x adına atama yapılıyorsa Python, o fonksiyonun tamamında x adını yerel kabul eder. Bu karar yalnızca atama satırından sonra değil, fonksiyon gövdesinin tamamı için geçerlidir. Bu yüzden üst satırdaki print(x) de yerel x değişkenini okumaya çalışır.

Fonksiyon parametreleri de yerel değişken gibi davranır. Örneğin def kare(sayi): tanımındaki sayi, yalnızca bu fonksiyon çağrısı boyunca kullanılabilen yerel bir addır. Parametre kullanmak, fonksiyonun hangi veriyi dışarıdan aldığını açıkça gösterir.

renk = "mavi"

def rengi_goster():
    renk = "yeşil"
    print(renk)

rengi_goster()
print(renk)

Beklenen çıktı şöyledir:

yeşil
mavi

Fonksiyon içindeki renk, dışarıdaki aynı adlı değişkeni yalnızca fonksiyon çalışırken gölgeler. Dışarıdaki renk değişmez. Ancak fonksiyon içinde önce print(renk), sonra renk = "yeşil" yazılsaydı, yerel değişken daha değer almadan okunacağı için UnboundLocalError oluşurdu.

Kapsam kurallarını küçük örneklerle pekiştirmek için Python bilgi testi ile değişkenler, fonksiyonlar ve temel Python bilgini ölçebilirsin.

Sayaç örneğiyle hatalı kodu ve return kullanan çözümü karşılaştır

Sayaçlarda bu hata sık görülür. Dışarıda tanımlanan count değişkenini fonksiyon içinde artırmak istediğinde, count += 1 satırı Python tarafından atama işlemi olarak değerlendirilir. Bu nedenle Python, fonksiyon içindeki count adını yerel değişken kabul eder. Ancak artırma yapılmadan önce yerel değer henüz oluşmadığı için hata alınır.

count = 0

def arttir():
    count += 1
    return count

print(arttir())

Bu kodun beklenen sonucu bir sayı yazdırmak değildir. Fonksiyon çağrısında şu hata oluşur:

UnboundLocalError: cannot access local variable 'count' where it is not associated with a value

Buradaki sorun, dışarıdaki count değerinin var olmaması değil, fonksiyon içinde aynı ada atama yapılmasıdır. Daha açık bir veri akışı için fonksiyonun değeri parametre olarak alması ve güncel sonucu return ile döndürmesi tercih edilebilir.

def arttir(count):
    return count + 1

count = 0

count = arttir(count)
print(count)

count = arttir(count)
print(count)

Beklenen çıktı şöyledir:

1
2

Bu sürümde fonksiyon, dışarıdan aldığı count değerini işler ve yeni değeri açıkça döndürür. Çağıran kod da bu sonucu tekrar count değişkenine atar. Böylece değerin nereden geldiği ve nereye gittiği kodu okuyan kişi için görünür kalır. Fonksiyon kapsamı ile veri akışını birlikte çalışmak, Python Özel Ders programı içinde ele alınabilecek temel Python konularından biridir.

global, parametre ve return arasında nasıl seçim yapılır?

Bir değişkeni fonksiyon içinde kullanırken seçim yapmadan önce üç noktaya bakabilirsin: Ortak durumu gerçekten doğrudan değiştirmek gerekiyor mu, fonksiyonu farklı değerlerle kolayca test etmek önemli mi ve değerin hareketi kodda açıkça görülmeli mi?

Yaklaşım Uygun olduğu durum Dikkat edilmesi gereken nokta
Parametre Fonksiyonun işleyeceği değer çağıran koddan geliyorsa Fonksiyon, aldığı değeri kendiliğinden dışarıda değiştirmez
Return İşlem sonucunun çağıran kodda kullanılacağı durumlarda Dönen değer bir değişkene atanmazsa sonuç kaybolabilir
global Küçük ve kontrollü bir ortak durumun doğrudan değiştirilmesi gerçekten gerekiyorsa Fonksiyonun dışarıdaki duruma bağımlılığı artar

Genel olarak parametre ve return birlikte kullanıldığında fonksiyonu test etmek kolaylaşır. Örneğin arttir(10) çağrısının hangi sonucu üreteceği, dışarıdaki başka değişkenleri incelemeden anlaşılabilir. Bu yaklaşım, özellikle fonksiyon sayısı arttıkça veri akışını takip etmeyi destekler.

global kullanımı yasak değildir. Ancak fonksiyonun dışındaki bir değişkeni değiştirdiğini açıkça belirtir ve bu yüzden dikkatli kullanılmalıdır. Bildirim, ilgili fonksiyonun içinde değişken okunmadan ya da değiştirilmeden önce yazılmalıdır:

count = 0

def arttir_global():
    global count
    count += 1
    return count

print(arttir_global())

Bu kodun beklenen çıktısı şöyledir:

1

Burada arttir_global() fonksiyonu, modül düzeyindeki count değişkenini doğrudan değiştirir. Küçük ve sınırları net örneklerde kullanılabilir. Buna karşılık aynı global değişkene birden fazla fonksiyon yazıp okuyorsa, değişikliğin hangi satırdan kaynaklandığını izlemek zorlaşabilir.

UnboundLocalError için üç adımlı teşhis listesi

  • Fonksiyon içinde aynı değişken adına =, += veya benzeri bir atama yapılıyor mu?
  • Değişken, atanmadan önce ya da yalnızca bazı koşullarda gerçekleşen bir atama yolundan önce okunuyor mu?
  • Fonksiyon parametresi veya dış kapsamdaki bir değişken, aynı adlı yerel değişken tarafından gölgeleniyor mu?

Sık Sorulan Sorular

UnboundLocalError yalnızca global değişkenlerde mi oluşur?

Hayır. Hata, Python'ın bir adı fonksiyon içinde yerel kabul etmesi ancak bu yerel değere atama yapılmadan önce erişilmeye çalışılmasıyla oluşur. Dışarıda global değişken bulunması bu durumu tek başına çözmez.

Bir fonksiyonun dışındaki değişkeni değiştirmek için global kullanmak zorunlu mudur?

Hayır. Çoğu durumda değeri parametre olarak alıp güncellenmiş sonucu return ile döndürmek daha açık bir çözümdür. Çağıran kod, dönen sonucu istediği değişkene atayabilir.

Hata mesajındaki x yerine neden farklı bir değişken adı yazabilir?

Hata mesajındaki x, Python'ın erişmeye çalıştığı gerçek değişken adını temsil eder. Kodunda count, puan veya toplam gibi hangi değişken sorun oluşturuyorsa mesajda o ad görünür.

UnboundLocalError hatasını çözmenin temel adımı, fonksiyonun hangi değeri aldığı, hangi değeri değiştirdiği ve sonucu nereye gönderdiği sorularını kod üzerinde açıkça yanıtlamaktır.

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