Değişkenlerin Kapsama Alanı
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