ProgramlamaBackend geliştirici

Python'da değişkenlerin görünürlük alanı (scope) nedir, `global` anahtar kelimesi nasıl çalışır? Yanlış bir anlayışın hata ile sonuçlandığı pratik bir örnek verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Değişkenin görünürlük alanı (scope), onun erişilebilir olduğu bağlamdır. Python'da hatırlanabilecek 4 ana görünürlük alanı vardır: LEGB prensibiyle.

  • Local (yerel) — fonksiyon içinde.
  • Enclosing (kapsayan) — iç içe fonksiyonlar için dış fonksiyon içinde.
  • Global (küresel) — modül düzeyinde.
  • Built-in (Python yerleşik isimleri).

global anahtar kelimesi, bir fonksiyonun içinde, küresel düzeyde tanımlanan bir değişkeni değiştirmenizi sağlar.

def foo(): global my_var my_var = 10 # küresel değişkeni değiştirir

global kullanılmadığında, fonksiyon içinde değişken yerel olarak kabul edilir, dış alanda aynı isim olsa bile.

Kandırmaca soru.

"Aşağıdaki kod ne yazdıracak?"

x = 10 def func(): x = 20 func() print(x)

Cevap: 10 yazdıracak, çünkü fonksiyon içinde yeni bir yerel x değişkeni oluşturuluyor, küresel değişken değişmiyor.

Konu hakkında bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


Hikaye

Bir botun komut işleyicisinde küresel bir sayaç tutmak istediler ama global anahtar kelimesini unuttular:

counter = 0 def increment(): counter += 1 # UnboundLocalError: yerel değişken 'counter' atama öncesinde referans alındı

Hata, yorumlayıcının counter'ı (fonksiyon içindeki atama olduğundan) yerel bir değişken olarak düşünmesinden kaynaklanıyor, küresel değil.


Hikaye

İç içe fonksiyonlarda, nonlocal anahtar kelimesini unutarak gizli değişkenin yerel bir scope oluşturduğunu unuttular:

def outer(): x = 0 def inner(): x += 1 # UnboundLocalError, x inner'da yerel olarak kabul edilir

Doğru:

def outer(): x = 0 def inner(): nonlocal x x += 1

Hikaye

Bir tek satırlık yazı yazarken:

x = 5 y = (lambda: (x := x + 1))() # Python 3.8'den önce SyntaxError, sonrasında UnboundLocalError

Lambda içinde atama için scope farkını unuttular. Tüm yapıların lambda içinde atamayı desteklemediği durumlar var, Python sürümüne bağlı olarak.