Python’da Değişkenler ve Kapsama Alanı (Scope)

Değişkenler

En basit haliyle bir değişken; hafızada tutulan verinin adresinden oluşan etikettir. Bu etiketi kullanarak istediğimiz kadar bu veriye ulaşabilir ve işleyebiliriz.

Bazı dillerde verinin tipini belirtmeniz gerekirken Python’da bu zorunluluk yoktur, bir değişkene önce tam sayı(int) sonra metin(string) verisi atayabilirsiniz.

Yeni bir değişken oluşturmak yada değerini değiştirmek için çoğu programlama dilinde genel olarak kullanılan şu söz dizimi kullanılır.

sayi = 6
metin = "araba"

# bir kaç değişkeni birden tanımlamak için şöyle kolay bir yazım da var
isim, soyisim, yas = "Ahmet", "Yılmaz", 40

Sabit(Static) değişkenler: Değer atadığımız bazı değişkenlerin değerlerinin daha sonra değiştirilmemesini isteriz. Bazı programlama dilleri böyle bir kısıtlamaya izin verse de Python’da böyle bir şey yok. Bunun yerine genel olarak kabul görmüş bir isimlendirme yöntemi olan değişken ismini büyük harflerle yazma yöntemi ile değişkenimizin sabit kalması gerektiğini bildirebiliriz.

Yukarıdaki basit kod parçasında tanımladığımız değişkenlere erişimimiz şu an için her satırda var. Fakat bu durum kodumuza bazı fonksiyonlar eklediğimizde, içinde tanımlı değişkenler için böyle olmayacaktır.

Kapsama Alanı (Scope): Bir değişkenin ulaşılabilir olduğu alan için kullanılır.

Bir Python dosyasının ana kısmında tanımlanan değişkenlere global değişkenler denir ve bunlara bu dosya içerisinde ve bu dosyayı import eden diğer dosyalarda erişilebilir. Bir değişkenin bu kadar genel erişilebilirliğe sahip olması projemiz büyüdüğünde kontrolü zorlaştırabilir ve sorunlara sebep olabilir, OOP yani sınıf kullanımı bunun önüne geçmek için iyi bir  yöntemdir.

Bir fonksiyon içerisinde tanımlanan değişkenlere ise yerel(local) değişkenler denir ve tanımlandığı fonksiyon dışında erişilemez. Parametre olarak verdiğimiz değerlere de local değişken gibi davranılır.

Basit bir örnek;

a = 0 # Global değişken

if a == 0:
    b = 1 # Global değişken

def fonksiyon(c): 
    d = 3 # Local değişken
    print(c) # c bir local değişkendir
    print(d)


# hatasız bir şekilde 7 ve 3 basacaktır
fonksiyon(7)

# hatasız bir şekilde 0 ve 1 basacaktır
print(a)
print(b)

# c ve d local değişkenler, buradan ulaşamayız
# hata dönecektir
print(c)
print(d)

Yukarıda gayet basit bir örnek ile kapsama alanını gördük ama her zaman bu kadar basit olmuyor durumlar. Örneğin fonksiyonumuz içerisinde, global olarak tanımlı bir değişken ile aynı isimli başka bir değişken tanımlarsak/değerini değiştirmek istersek ve kapsama alanı etkisini tam anlamamışsak, kodumuz beklendiği gibi çalışmayabilir.

adet = 5

def sifirla():
    adet = 0
    print(adet)

sifirla() # 0 basacaktır

print(adet) # 5 basacaktır

Burada fonksiyonumuz global alandaki adet değişkeninin değerini değiştirmek yerine local alanda yeni bir adet değişkeni oluşturur. Bu yüzden global alanda adet değişkenine eriştiğimizde hala 5 değerini görürüz.

Kodumuzun istendiği gibi çalışması için global anahtar kelimesini kullanmamız gereklidir. Global anahtar kelimesinin kullanımı kodunuzun yönetilmesini zorlaştıracağı için tavsiye edilmez.

adet = 5

def sifirla():
    global adet
    adet = 0
    print(adet)

sifirla() # 0 basacaktır

print(adet) # 5 basacaktır

Sınıflar içerisinde tanımlanan değişkenler de yine local değişkenlerdir ve kapsama alanı tanımlandığı sınıf ile sınırlıdır. Fakat sınıfın değerlerine ulaşmak için kullanılan “.” operatörü ile bu değişkene, oluşturulmuş bir sınıf örneği(instance) üzerinden erişilebilir.


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

“Python’da Değişkenler ve Kapsama Alanı (Scope)” için 2 cevap

  1. Bu blogu bu kadar gec kesfetmis olmam uzucu :) Elinize saglik bir garip scope olayini da paylasayim.

    try:
    test = ‘Garip bir sey’
    except:
    test = ‘Hatali’

    print(test)

    Bu kodu compiled dillerde ‘test’ does not exist in the current context gibi bir hata dondurur. Buradaki olay ise tamamen garip sekilde calisiyor.

    Ayni sekilde su kod da tanimsiz olsa bile calisiyor:

    if 2 > 1:
    mesaj = ‘Yeni Yazi’

    print(mesaj)

    Sanirim scope olayi sadece metod isimlerinde falan duzgun calisiyor.

    if ve try kendi icinde yeni bir scope olusturmuyor yani.

  2. hakan

    adet = 5

    def sifirla():
    global adet
    adet = 0
    print(adet)

    sifirla() # 0 basacaktır

    print(adet) # 5 basacaktır !!!”0 basacaktır” denmeliydi.
    ————————————
    hocam, burada 5 basacaktır demişsiniz ama fonksiyon içinde global anahtar kelimesini kullandığımız için ve “print(adet)” demeden önce fonksiyonu çağırdığımız için “adet” değişkeni 0 olacak.
    yani, her iki durumda da sıfır basılacak ekrana.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir