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.
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.
"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.
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.