Python’da global değişkenler

Python’da değişken oluşturmayı = operatörü ile yaptığımızı biliyoruz.

İlişkili olduğu konular : python-variable

Python’da değişken oluşturma= 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.

Bu yazı topluluk tarafından oluşturuldu. Lisans bilgisine bakabilirsiniz. Yanlış veya eksik bilgileri düzenlemek için github üzerinden katkıda bulunabilirsiniz.

Kategoriler: Yazı, Python

Okumaya devam et!

Python’da Veri Türleri

Python dökümanlarına göre yerleşik veri türleri nümerik, dizi, mapping, class, nesne ve hatalar olarak tanımlanır.

Python101 – Dizeler

Şimdi dizelerle yapılabilecek harika bir numara sunuyoruz: def soyle(dize): for karakter in dize: print("Bir " + karakter + " ver") print("'" + karakter + "'") soyle("Kayıp") def orta(dize): print("Ortanca karakter:", dize[len(didze) // 2]) orta("abcdefg") orta("The Python Programming Language") orta("Atlanta") Ve çıktı şu: Bir K ver 'K' Bir a ver 'a' Bir y ver 'y' Bir…

Python’da bir dosyaya yazı nasıl eklenir?

Var olan dosyanın üzerine yazmak yerine dosyaya ekleme nasıl yapılır? Bunun en basit yöntemi açma modunu “a” veya “ab” seçerek dosyayı ekleme modunda açmaktır.

Yorum Gönderin

E-posta hesabınız yayımlanmayacak.

koddla
Tema Mundana by WowThemes.net.