Bu bölümde global adlı bir deyimden söz edeceğiz. İsterseniz globalin ne olduğunu anlatmaya çalışmak yerine doğrudan bir örnekle işe başlayalım. Diyelim ki şöyle bir şey yazdık:
Burada her zamanki gibi fonk() adlı bir fonksiyon tanımladık ve daha sonra bu fonksiyonu çağırdık. Sonuç olarak bu fonksiyonu çalıştırdığımızda 5 çıktısını aldık...
Gördüğünüz gibi, fonksiyon içinde a adlı bir değişkenimiz var. Şimdi şöyle bir şey yazarak bu a değişkenine ulaşmaya çalışalım:
Bu kodları çalıştırdığımızda şöyle bir hata alırız:
Bu hata mesajı bize a diye bir değişken olmadığını söylüyor. Halbuki biz fonk() adlı fonksiyon içinde bu a değişkenini tanımlamıştık, değil mi? O halde neden Python a değişkenini bulamadığından yakınıyor? Hatırlarsanız bu bölümün en başında, bir fonksiyonun sınırlarının ne olduğundan söz etmiştik. Buna göre yukarıdaki fonk() adlı fonksiyon def fonk(): ifadesiyle başlıyor, print a ifadesiyle bitiyor. Bu fonksiyonun etkisi bu alanla sınırlıdır. Pythonda buna isim alanı (namespace) adı verilir. Herhangi bir fonksiyon içinde tanımlanan her şey o fonksiyonun isim alanıyla sınırlıdır. Yani mesela yukarıdaki fonksiyon içinde tanımladığımız a değişkeni yalnızca bu fonksiyon sınırları dâhilinde geçerlidir. Bu alanın dışına çıkıldığında a değişkeninin herhangi bir geçerliliği yoktur. O yüzden Python yukarıdaki gibi bir kod yazdığımızda a değişkenini bulamayacaktır. İsterseniz bu durumu daha iyi anlayabilmek için yukarıdaki örneği şöyle değiştirelim:
Bu kodları çalıştırdığımızda ise şöyle bir çıktı alırız:
Buradaki ilk 5 sayısı fonksiyon içindeki anın değerini gösteriyor. Alt satırdaki 10 değeri ise anın fonksiyon sınırları dışındaki değerini... Gördüğünüz gibi, a değişkenini fonksiyon dışında da kullanabilmek için bu değişkeni dışarıda tekrar tanımlamamız gerekiyor. Peki, biz fonksiyon içindeki a değişkenine fonksiyon dışından da erişemez miyiz? Elbette erişebiliriz. Ama bunun için global adlı bir deyimden yararlanmamız gerekir. Dilerseniz yukarıda ilk verdiğimiz örnek üzerinden giderek bu global deyimini anlamaya çalışalım:
Kodları bu şekilde yazdığımızda Pythonun bize bir hata mesajı göstereceğini biliyoruz. Şimdi bu kodlara şöyle bir ekleme yapalım:
Burada yaptığımız şey, fonksiyonu tanımladıktan sonra fonksiyon gövdesinin ilk satırına global a diye bir şey eklemekten ibaret. Bu ifade fonksiyon içindeki a adlı değişkenin global olduğunu, yani fonksiyonun kendi sınırları dışında da geçerli bir değer olduğunu söylüyor. Bu kodları çalıştırdığımızda şöyle bir çıktı alıyoruz:
Gördüğünüz gibi, global deyimi bir fonksiyon içindeki değerlere fonksiyon dışından da erişmemize yardımcı oluyor...
Şimdi şöyle bir şey yazdığımızı düşünün:
Buradaki return deyimine takılmayın biraz sonra bunun tam olarak ne işe yaradığını göreceğiz. Biz yalnızca yukarıdaki kodların çıktısına odaklanalım.
Burada öncelikle bir a değişkeni tanımladık. Bu değişkenin değeri 10. Ardından bir fonk() adlı bir fonksiyon oluşturduk. Bu fonksiyon içinde değeri 5 olan bir a değişkeni daha tanımladık. Fonksiyon dışında ise, iki adet çıktı veriyoruz. Bunlardan ilki fonksiyon içindeki a değişkeninin değerini gösteriyor. İkincisi ise fonksiyon dışındaki a değişkeninin değerini... Yani bu kodları çalıştırdığımızda şöyle bir çıktı elde ediyoruz:
Burada fonksiyon içinde ve dışında aynı adda iki değişken tanımlamamıza rağmen, Pythondaki isim alanı kavramı sayesinde bu iki değişkenin değeri birbirine karışmıyor. Ama bir de şu kodlara bakın:
Burada bir önceki kodlara ilave olarak global a satırını yazdık. Bu defa çıktımız şöyle oldu:
Gördüğünüz gibi, global deyimi fonksiyon dışındaki a değişkenini sildi... Şimdi bu noktada kendimize şu soruyu sormamız lazım: Acaba bizim istediğimiz şey bu mu? Özellikle üzerinde birkaç farklı kişinin çalıştığı büyük projelerde böyle bir özellik ne tür sorunlara yol açabilir? Üzerinde pek çok farklı kişinin çalıştığı büyük projelerde global deyiminin büyük sıkıntılar doğurabileceği apaçık ortada. Siz programın bir yerine bir değişken tanımlamaya çalışırken, başka bir geliştirici bir fonksiyon içinde global deyimini kullanarak fonksiyon dışındaki aynı adlı değişkenlerin değerini birbirine katmış olabilir... İşte bu tür sıkıntılardan ötürü, her ne kadar faydalı bir araçmış gibi görünse de, global deyiminin sakıncaları faydalarından çoktur. O yüzden yazdığınız programlarda global deyiminden mümkün olduğunca uzak durmanızda fayda var.
Kod:
# -*- coding: utf-8 -*- def fonk(): a = 5 print a fonk()
Burada her zamanki gibi fonk() adlı bir fonksiyon tanımladık ve daha sonra bu fonksiyonu çağırdık. Sonuç olarak bu fonksiyonu çalıştırdığımızda 5 çıktısını aldık...
Gördüğünüz gibi, fonksiyon içinde a adlı bir değişkenimiz var. Şimdi şöyle bir şey yazarak bu a değişkenine ulaşmaya çalışalım:
Kod:
# -*- coding: utf-8 -*- def fonk(): a = 5 print a fonk() print "a'nın değeri: ", a
Bu kodları çalıştırdığımızda şöyle bir hata alırız:
Kod:
Traceback (most recent call last): File "deneme.py", line 7, in <module> print a NameError: name 'a' is not defined
Bu hata mesajı bize a diye bir değişken olmadığını söylüyor. Halbuki biz fonk() adlı fonksiyon içinde bu a değişkenini tanımlamıştık, değil mi? O halde neden Python a değişkenini bulamadığından yakınıyor? Hatırlarsanız bu bölümün en başında, bir fonksiyonun sınırlarının ne olduğundan söz etmiştik. Buna göre yukarıdaki fonk() adlı fonksiyon def fonk(): ifadesiyle başlıyor, print a ifadesiyle bitiyor. Bu fonksiyonun etkisi bu alanla sınırlıdır. Pythonda buna isim alanı (namespace) adı verilir. Herhangi bir fonksiyon içinde tanımlanan her şey o fonksiyonun isim alanıyla sınırlıdır. Yani mesela yukarıdaki fonksiyon içinde tanımladığımız a değişkeni yalnızca bu fonksiyon sınırları dâhilinde geçerlidir. Bu alanın dışına çıkıldığında a değişkeninin herhangi bir geçerliliği yoktur. O yüzden Python yukarıdaki gibi bir kod yazdığımızda a değişkenini bulamayacaktır. İsterseniz bu durumu daha iyi anlayabilmek için yukarıdaki örneği şöyle değiştirelim:
Kod:
# -*- coding: utf-8 -*- def fonk(): a = 5 print a fonk() a = 10 print "a'nın değeri: ", a
Bu kodları çalıştırdığımızda ise şöyle bir çıktı alırız:
Kod:
5 a'nın değeri: 10
Buradaki ilk 5 sayısı fonksiyon içindeki anın değerini gösteriyor. Alt satırdaki 10 değeri ise anın fonksiyon sınırları dışındaki değerini... Gördüğünüz gibi, a değişkenini fonksiyon dışında da kullanabilmek için bu değişkeni dışarıda tekrar tanımlamamız gerekiyor. Peki, biz fonksiyon içindeki a değişkenine fonksiyon dışından da erişemez miyiz? Elbette erişebiliriz. Ama bunun için global adlı bir deyimden yararlanmamız gerekir. Dilerseniz yukarıda ilk verdiğimiz örnek üzerinden giderek bu global deyimini anlamaya çalışalım:
Kod:
# -*- coding: utf-8 -*- def fonk(): a = 5 print a fonk() print "a'nın değeri: ", a
Kodları bu şekilde yazdığımızda Pythonun bize bir hata mesajı göstereceğini biliyoruz. Şimdi bu kodlara şöyle bir ekleme yapalım:
Kod:
# -*- coding: utf-8 -*- def fonk(): global a a = 5 print a fonk() print "a'nın değeri: ", a
Burada yaptığımız şey, fonksiyonu tanımladıktan sonra fonksiyon gövdesinin ilk satırına global a diye bir şey eklemekten ibaret. Bu ifade fonksiyon içindeki a adlı değişkenin global olduğunu, yani fonksiyonun kendi sınırları dışında da geçerli bir değer olduğunu söylüyor. Bu kodları çalıştırdığımızda şöyle bir çıktı alıyoruz:
Kod:
5 a'nın değeri: 5
Gördüğünüz gibi, global deyimi bir fonksiyon içindeki değerlere fonksiyon dışından da erişmemize yardımcı oluyor...
Şimdi şöyle bir şey yazdığımızı düşünün:
Kod:
# -*- coding: utf-8 -*- a = 10 def fonk(): a = 5 return a print "a'nın fonksiyon içindeki değeri", fonk() print "a'nın fonksiyon dışındaki değeri: ", a
Buradaki return deyimine takılmayın biraz sonra bunun tam olarak ne işe yaradığını göreceğiz. Biz yalnızca yukarıdaki kodların çıktısına odaklanalım.
Burada öncelikle bir a değişkeni tanımladık. Bu değişkenin değeri 10. Ardından bir fonk() adlı bir fonksiyon oluşturduk. Bu fonksiyon içinde değeri 5 olan bir a değişkeni daha tanımladık. Fonksiyon dışında ise, iki adet çıktı veriyoruz. Bunlardan ilki fonksiyon içindeki a değişkeninin değerini gösteriyor. İkincisi ise fonksiyon dışındaki a değişkeninin değerini... Yani bu kodları çalıştırdığımızda şöyle bir çıktı elde ediyoruz:
Kod:
a'nın fonksiyon içindeki değeri 5 a'nın fonksiyon dışındaki değeri: 10
Burada fonksiyon içinde ve dışında aynı adda iki değişken tanımlamamıza rağmen, Pythondaki isim alanı kavramı sayesinde bu iki değişkenin değeri birbirine karışmıyor. Ama bir de şu kodlara bakın:
Kod:
# -*- coding: utf-8 -*- a = 10 def fonk(): global a a = 5 return a print "a'nın fonksiyon içindeki değeri", fonk() print "a'nın fonksiyon dışındaki değeri: ", a
Burada bir önceki kodlara ilave olarak global a satırını yazdık. Bu defa çıktımız şöyle oldu:
Kod:
a'nın fonksiyon içindeki değeri 5 a'nın fonksiyon dışındaki değeri: 5
Gördüğünüz gibi, global deyimi fonksiyon dışındaki a değişkenini sildi... Şimdi bu noktada kendimize şu soruyu sormamız lazım: Acaba bizim istediğimiz şey bu mu? Özellikle üzerinde birkaç farklı kişinin çalıştığı büyük projelerde böyle bir özellik ne tür sorunlara yol açabilir? Üzerinde pek çok farklı kişinin çalıştığı büyük projelerde global deyiminin büyük sıkıntılar doğurabileceği apaçık ortada. Siz programın bir yerine bir değişken tanımlamaya çalışırken, başka bir geliştirici bir fonksiyon içinde global deyimini kullanarak fonksiyon dışındaki aynı adlı değişkenlerin değerini birbirine katmış olabilir... İşte bu tür sıkıntılardan ötürü, her ne kadar faydalı bir araçmış gibi görünse de, global deyiminin sakıncaları faydalarından çoktur. O yüzden yazdığınız programlarda global deyiminden mümkün olduğunca uzak durmanızda fayda var.
