Python’da değişken oluşturmayı =
operatörü ile yaptığımızı biliyoruz. Yerel bir değişkeni değişken_adı = değişken_değeri
ile tanımlıyorduk. Global değişken tanımlamak için ise global anahtar kelimesini kullanırız. Yerel değişkenlerin aksine, global değişken oluştururken, önce değişken tanımı yapıp sonra değer verebiliyoruz. Aşağıdaki fonksiyon ile bir örneğe bakalım:
def create_global_variable():
global global_variable # global değişkeni önce tanımlarız
global_variable = 'Foo' # sonra değer atarız
Bir fonksiyonu tanımlamak tabiki bu kodun çalışmasını sağlamaz. Dolayısıyla bu fonksiyonu çağırmamız da gerekir:
>>> create_global_variable()
Global değişkeni tanımladıktan sonra değişiklik yapmadan kullanmayı da tercih edebiliriz:
def use_global_variable():
return global_variable + '!!!'
Bu şekilde global değişkenimizi kullandığımızda aşağıdaki sonucu alırız:
>>> use_global_variable()
'Foo!!!'
Fonksiyon içinden global değişken değerini değiştirme
Farklı bir nesneden global değişkenimizde değişiklik yapmak için yine global anahtar kelimesini kullanmamız gerekir. Yani fonksiyon içinden global değişkene ulaşmak için:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Bu fonksiyonu yazdıktan sonra çağırmamız gerektiğini unutmayın. Çağırmadığımız zaman bir etkisi olmayacaktır ve değişkenimizin değeri değişmeyecektir:
>>> use_global_variable()
'Foo!!!'
Fonksiyonu çağıralım:
>>> change_global_variable()
Bundan sonra global değişkenimizin değiştiğini göreceğiz. Değişkenimiz artık 'Bar'
dizesine eşit:
>>> use_global_variable()
'Bar!!!'
Burada önemli bir not vermekte fayda var. Python’da global değişkenler tam anlamıyla global sayılmazlar. Sadece modül seviyesinde globaldirler. Dolayısıyla sadece modülde yazılı fonksiyonlar için geçerlidirler. Fonksiyonlar hangi modülde yazılı olduklarını bilirler. Başka modüller tarafından import edilseler bile, yine de, kendi modüllerinin global değişkenlerini ararlar.
Aynı isimde yerel değişkenler
Aynı isimde yerel bir değişken oluşturursanız global değişkenin etkisini gölgeler:
def use_local_with_same_name_as_global():
# yerel değişken için kötü bir isim olsa da:
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Ancak, aynı isimde yerel değişken oluşturmak global değişkenin değerini etkilemez:
>>> use_global_variable()
'Bar!!!'
Ne yaptığınızı gerçekten bildiğiniz durumlar haricinde yerel ve global değişkene aynı ismi vermekten kaçınmalısınız.
Sınıf içinde global değişkenler
Peki bir sınıf içindeki fonksiyonda global bir değişken tanımlasaydık, ve bu değişkeni başka bir class içerisindeki fonksiyonda kullanmak isteseydik ne olacaktı?
Buna aşağıdaki örnek ile bakalım:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
Çıktı:
>>> Bar().bar()
'Foo!!!'
Global değişken modül içerisinde görünür olduğu için bir sorun yaşamadan istediğimizi yapabiliyoruz. Ancak, bu tür bir kullanım yerine sınıf özelliklerini kullanmak daha yararlı olabilir. Böylece modül namespace’inizi karmaşıklaştırmış olmazsınız.
Başka bir örneğe bakalım:
Diyelim ki aşağıdaki gibi bir modülümüz olsun:
# sample.py
myGlobal = 5
def func1():
myGlobal = 42
def func2():
print myGlobal
func1()
func2()
Bu kodun 42’yi bastırmasını beklersiniz ancak aslında 5’i bastırır. Burada ‘global
‘ ifadesini func1()
içinde kullanırsak bu sefer func2()
42’yi yazdırır.
def func1():
global myGlobal
myGlobal = 42
Burada olan şey, fonksiyon içerisinde değer atanmasını Pythonun bir yerel değişken olarak kabul etmesidir. Açık bir şekilde bu değişkenin global olduğunu belirtmezsek, değişken yerel kabul edilir.
func1() içinde myGlobal
değişkenine 42 değerini atadığımızda, Python, yerel bir değişken oluşturur. Bu değişken global olanı gölgeler. Ancak bu yerel değişkenin kapsamı func1() çalışıp bittiğinde sona erer. Sonrasında garbage-collector (çöp toplayıcısı) tarafından sonlandırılır. Haliyle, func2()
bu yerel değişkeni hiç görmez.
Namespace ile ilgili kararların derleme kısmında verildiğini de söylemekte yarar var. Bu neden önemli? Örneğin global olmayan myGlobal
değerine func1()
içinde tanım yapmadan ulaşmaya çalışırsanız (ilk tanımlandığında global değildi unutmayın) bir UnboundLocalError
hatası alırsınız. Çünkü Python çalışma esnasında bu değişkenin yerel olması gerektiğine karar verdi. Ancak, ‘global
‘ ifadesi ile Pythona bu değer için daha farklı bir kapsamda bakması gerektiğini söylersiniz.