Programlama dillerinde değişkenler oluşturuldukları alanda tanımlıdır. Buna Kapsama Alanı adı verilir. Alan olarak hiyerarşik bir düzen tanımlıdır. Programlama dilleri genel olarak {} arasında yer alan alana kapalı bir alan gibi davranma eğilimindedir. Python’da, süslü parantezler {} yerine girintiler ve koşullu ifadeler, fonksiyonlar gibi kod blokları için de iki nokta üst üste : kullanılır. Bu alanların dışındaki değişkenlere bu alanlar içinde erişip kullanabilirsiniz ama bu alanlar içindeki değişkenlere alan dışından erişemezsiniz.

Örneğin bir fonksiyon içinde tanımladığınız bir değişken yalnızca o fonksiyon içinde kullanılabilir. Fonksiyon dışında o değişkeni kullanamazsınız.

def ekranaYazdir():
  sayi = 300
  print(sayi)

ekranaYazdir()

Çıktı:

300

sayi isimli değişken tanımlandığı fonksiyon içinde print() fonksiyonu ile kullanılabiliyor.

 

sayi = 300
def ekranaYazdir():
  print(sayi)

ekranaYazdir()

Çıktı:

300

sayi isimli değişken hiyerarşik olarak üst alanda tanımlandığı için fonksiyon içinde print() fonksiyonu ile kullanılabiliyor.

Hatta, fonksiyon içinde bir alt fonksiyon oluşturduğumuzda, bu fonksiyonun kapsama alanı içinde, üst seviyede yer alan değişkenlerin tamamına ulaşabiliriz;

sayi1 = 300
def ekranaYazdir():
    sayi2 = 500
    def icFonksiyon():
      print(sayi1)
      print(sayi2)
    icFonksiyon()


ekranaYazdir()

Çıktı:

300
500

 

Ancak, fonksiyon içinde tanımlanan sayi isimli değişkeni fonksiyonun üst alanında erişip kullanamayız;

def ekranaYazdir():
  sayi = 300

print(sayi)
ekranaYazdir()

Çıktı:

NameError: name 'sayi' is not defined

 

Hiyerarşide en üst seviyede bulunan genel kapsama alanındaki değişkenlere tüm alt seviye kapsama alanlarından erişilebilir. Bu kapsama alanına Global Kapsama Alanı adını veriyoruz.

 

Eğer genel kapsama alanı ile alt kapsama alanlarında aynı değişken adını kullanırsanız, her değişken bulunduğu alandaki değeri kullanmanıza izin verir. Bu duruma da, Değişken Üzerine Yazma(Variable Overriding) adı verilir.

sayi = 300
def ekranaYazdir():
    sayi = 500
    print(sayi)
print(sayi)
ekranaYazdir()

Çıktı:

300
500

Gördüğünüz gibi fonksiyon içinde değişken aynı isimle tanımlı olduğu için genel kapsama alanındaki değişken değeri değil kendi kapsama alanındaki değişken değeri geçerli oldu.

 

Eğer fonksiyon içindeki gibi bir alt kapsama alanında iseniz ancak bu değişkeni genel kapsama alanında ve dolayısıyla diğer fonksiyonların içinde de kullanmak istiyorsanız değişkeni başına global anahtar kelimesini getirerek genel kapsama alanındaymış gibi tanımlayabilirsiniz;

def ekranaYazdir():
    global sayi 
    sayi = 500
    print(sayi)

ekranaYazdir()
print(sayi)

Çıktı:

500
500

Ancak burada dikkat etmeniz gereken püf noktası, alt kapsama alanında global anahtar kelimesi ile tanımlanan değişkenin anında genel kapsama alanında geçerli olmamasıdır. Ancak fonksiyon çalıştırıldığında bu değişken genel kapsama alanında tanımlı olur. Yukarıdaki örneğimizde print(sayi) ifadesini fonksiyonu çağırıp çalıştırdığımız ekranaYazdir() ifadesinin önüne alırsak değişkenin tanımlı olmadığı hatasını verecektir;

def ekranaYazdir():
    global sayi 
    sayi = 500
    print(sayi)
print(sayi)
ekranaYazdir()

Çıktı:

NameError: name 'sayi' is not defined

 

Daha önce genel kapsama alanındaki değişken adı ile aynı adı taşıyan alt kapsama alanındaki değişken kullanıldığında her ikisinin de kendi kapsama alanında geçerli olduğunu söylemiştik. Ancak alt kapsama alanında yer alan değişken global anhatar kelimesi ile kullanılarak genel kapsama alanındaki değişkenin değerini değiştirebilir. Ancak biraz önce de ifade ettiğimiz gibi bunun geçerli olabilmesi için alt kapsama alanını oluşturan fonksiyonun çalıştırılmış olması gereklidir;

sayi = 300
def ekranaYazdir():
    global sayi 
    sayi = 500
print(sayi)
ekranaYazdir()
print(sayi)

Çıktı:

300
500