31. Globalleştirme kötü bir şeydir globalization is a bad thing.

Bir arkadaşınızla birlikte uzun bir program yazdığınızı varsayın. İyi bir programcı olduğunuz için değişken adlarını oluştururken onları açıklayan adlar kullanırsınız. Sonra şunu düşünebilirsiniz: Arkadaşım da benim seçtiğim adları seçerse ve ben değişkenimin aldığı değeri değiştirirsem onun değişkenlerinin değeri de o istemediği halde değişir mi?

Bu tip problemlerden kaçınmak için Python'da namespaces kullanılır. Böylelikle programın bir bölümdeki bir değişkenin değerinin değiştirilmesi başka bir bölümdeki aynı isimdeki bir değişkenin değerini etkilemez. Bu derste namespaces'leri öğreneceğiz.


Yerel Değişkenler

Basit bir örnekle başlayalım:

>>> a = 1
>>> def my_function():
...     a = 3
...     print a
...    

>>> my_function()
3

>>> print a
1

a'nın değerinin değişmemesi sizin için bir sürpriz oldu mu? Burada ne olduğunu açıklayalım.

Önce "a" değişkenini tanımladınız ve ona 1 değerini verdiniz. Sonra, bir fonksiyonun içerisinde "a" ya 3 değerini verdiniz. Gerçekte olan şey, fonksiyonun içerisinde "a" adında yeni bir değişken tanımlamak ve ona 3 değerini vermektir. Diğer  "a" nın değeri bundan etkilenmez. 

Python her fonksiyonun içerisinde otomatik olarak namespace'leri yaratır. Bunlar bu fonksiyonun dışında aynı adla tanımlanmış değişkenlerden bağımsızdırlar. Namespace'i Python'un tüm değişken adlarını takip ettiği bir not defterine benzetebiliriz. Python her bir fonksiyon için ayrı bir not defteri oluşturduğundan aynı değişkenin başka bir fonksiyonda kullanılması bizi artık endişelendirmez.

Fonksiyonun içerisinde tanımlanmış olan değişkenler, fonksiyonun çalışması bittiğinde geçerliliklerini kaybederler, buna alan dışı (out of scope) denir.

>>> def simple_function():
...     local_variable = "I'm here!"
...     print local_variable
...    
>>> simple_function()
I'm here!

>>> print local_variable
Traceback (most recent call last):
  File "<input>", line 1, in ?
NameError: name 'local_variable' is not defined

Namespace kullanarak bu işi yapabiliyoruz, ancak bir fonksiyonun içerisindeki bir değişkenin değerini değiştirmek isterseniz ne yapmalısınız? Örneğin, bir fonksiyonu kaç kez çağırdığımızı takip etmek isteyelim. Bunu Python komutu olan  global'i kullanarak yapabiliriz:

>>> number_of_times = 0
>>> def two_year_old_child():
...     global number_of_times
...     number_of_times += 1
...     print "Why?     %s times" % number_of_times
...    
>>> two_year_old_child()
Why?          1 times

>>> two_year_old_child()
Why?          2 times

>>> two_year_old_child()
Why?          3 times

>>> print number_of_times
3

 global komutunu kullanarak, Python'a değişkenin yeni bir versiyonunu fonksiyonun içinde yeniden yaratmamasını ve daha önceden yaratılmış olan versiyonunu kullanmasını söylüyoruz.

global tanımlanmış değişkenleri kullanmaktan her zaman kaçının, çünkü bunlar programınızın başka kısımlarında sizin istemediğiniz değişikliklere yol açabilir.  Programlamada, globalleştirme istenmeyen ve kaçınılması gereken bir şeydir.


Alan Dışı (Out of scope)

Larry ve Curly keyifle yürüyordular. Birden Moe onları uzaktan gördü ve onlara doğru koşmaya başladı. Tam onları yakalayacakken alan dışı oldu ve ekrandan kayboldu. Moe'nun arkadaşlarına ulaşmasını istiyorsanız, aşağıdaki  # sembollerini kaldırmalısınız.

Larry = UsedRobot(colour='blue')
Curly = UsedRobot(1, 3, colour='green')

# Using two keywords you haven't seen yet!
for i in range(3):
    Larry.move()
    Curly.move()

def wait_for_me():
    #global Moe
    Moe = UsedRobot(1, 2, colour='yellow')
    # Using two same new keywords again!
    for i in range(3):
        Moe.move()
        Larry.move()
        Moe.move()
        Curly.move()

wait_for_me()
# first image below; Moe is there.
Larry.move()
# second image below; Moe is gone.
Curly.move()
#Moe.move()
Larry.move()
Curly.move()
#Moe.move()
Larry.turn_off()

Moe there

Moe gone


Deneyin!

Bu programı Reeborg'un dünyasında kendi kendinize deneyin ve gerekli değişiklikleri yaparak Moe'nun arkadaşlarına ulaşmasını sağlayın.

previousNesneye dayalı programlama:  "nokta" kullanımı. - home - Many returnsnext