Bu yazıda, namespace (ad alanı) hakkında bilgi edineceksiniz; isimlerden nesnelere eşleme ve bir değişkenin kapsamı hakkında detaylı bilgiye ulaşacaksınız.
Python’da Ad Nedir?
Ad (tanımlayıcı olarak da bilinir) yalnızca nesnelere verilen bir addır. Python’daki her şey bir nesnedir. Ad, temeldeki nesneye erişmenin bir yoludur.
Örneğin, a = 2 atamasını yaptığımızda, burada 2 bellekte depolanan bir nesne ve a ile ilişkilendirdiğimiz addır. Yerleşik id() işlevi aracılığıyla bazı nesnelerin adresini (RAM’den) alabiliriz.
Kodları inceleyelim
1 2 3 4 5 6 7 8 9 | #id değerlerinde farklılık olabilir. RAM üzerine kaydedilen adresi verir. a = 2 # Çıktı:id(2) = 1680043056 print('id(2) =', id(2)) # Çıktı: id(a) = 1680043056 print('id(a) =', id(a)) |
Çıktı:
1 2 3 4 | id(2) = 1680043056 id(a) = 1680043056 |
Burada her ikisi de aynı nesneyi ifade eder. İşleri biraz daha ilginç hale getirelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Not: Farklı id değerleri alabilirsiniz. a = 2 # Çıktı: id(a) = 1680043056 print('id(a) =', id(a)) a = a+1 # Çıktı: id(a) = 1680043088 print('id(a) =', id(a)) # Çıktı: id(3) = 1680043088 print('id(3) =', id(3)) b = 2 # Çıktı: id(2)= 1680043056 print('id(2) =', id(2)) |
Başlangıçta bir nesne 2 oluşturulur ve a adı onunla ilişkilendirilir, a = a + 1 yaptığımızda yeni bir nesne 3 oluşturulur ve şimdi bu nesne ile ilişkilendirilir.
id(a) ve id(3) değerlerinin aynı olduğunu unutmayın.
Ayrıca, b = 2 yaptığımızda, yeni b ismi önceki nesne 2 ile ilişkilendirilir.
Bu, Python’un yeni bir yinelenen nesne oluşturması gerekmediğinden etkilidir. İsim bağlamanın bu dinamik doğası Python’u güçlü kılar; bir ad herhangi bir nesne türünü ifade edebilir.
1 2 3 4 5 | >>> a = 5 >>> a = 'Merhaba Dünya' >>> a = [1,2,3] |
Tüm bunlar geçerlidir ve farklı örneklerde üç farklı nesne türüne atıfta bulunulur. Fonksiyonlar da nesnedir, bu nedenle bir ad da bunlara başvurabilir.
1 2 3 4 5 6 7 8 | def merhabaYaz(): print("Merhaba") a = merhabaYaz() # Çıktı: Merhaba |
Aynı ismimiz a bir fonksiyona atıfta bulunabilir ve fonksiyonu onunla çağırabiliriz, oldukça düzgün görünür.
Python Namespace (Ad Alanı) Nedir?
Artık isimlerin ne olduğunu anladığımıza göre, ad alanları kavramına geçebiliriz.
Basitçe söylemek gerekirse, ad alanı bir ad koleksiyonudur.
Python’da, bir ad alanını tanımladığınız her adın karşılık gelen nesnelere eşlenmesi olarak hayal edebilirsiniz.
Belirli bir zamanda farklı ad alanları birlikte bulunabilir, ancak tamamen izole edilmiştir.
Python yorumlayıcısını başlattığımızda tüm yerleşik adları içeren bir ad alanı oluşturulur ve çıkmadığımız sürece var olur.
Bu nedenle id(), print() vb. Gibi yerleşik işlevler programın herhangi bir bölümünden her zaman bize ulaşabilir. Her modül kendi global ad alanını oluşturur.
Bu farklı ad alanları yalıtılmıştır. Bu nedenle, farklı modüllerde bulunabilecek aynı ad çakışmaz.
Modüller çeşitli fonksiyonlara ve sınıflara sahip olabilir. Bir işlev çağrıldığında, içinde tanımlanan tüm adları içeren bir yerel ad alanı oluşturulur. Sınıfta da durum aynıdır. Aşağıdaki diyagram bu kavramı netleştirmeye yardımcı olabilir.
Python Değişken Kapsamı
Tanımlanmış çeşitli benzersiz ad alanları olmasına rağmen, bunların hepsine programın her bölümünden erişemeyebiliriz. Kapsam kavramı devreye girer.
Kapsam, programın herhangi bir önek olmadan doğrudan bir ad alanına erişilebildiği bölümüdür.
Herhangi bir anda, en az üç iç içe kapsam vardır.
Yerel adlara sahip geçerli fonksiyonun kapsamı
Global isimlere sahip modülün kapsamı
Yerleşik adları olan en dış kapsam
Bir işlevin içinde başvuru yapıldığında, ad yerel ad alanında, daha sonra genel ad alanında ve son olarak yerleşik ad alanında aranır.
Başka bir işlevin içinde bir işlev varsa, yerel kapsamın içine yeni bir kapsam yerleştirilir.
Python Kapsam ve Namespace Örneği
1 2 3 4 5 6 7 8 | def dis_function(): b = 20 def ic_func(): c = 30 a = 10 |
ic_function() içinde olduğumuzda, c bizim için yereldir, b yerel değildir ve a globaldir. C’ye yeni değerler atayabilir ve atayabiliriz, ancak yalnızca ic_function() ‘dan b ve a’yı okuyabiliriz.
B’ye bir değer olarak atamaya çalışırsak, yerel ad alanında yerel olmayan b’den farklı yeni bir b değişkeni oluşturulur. A’ya bir değer atadığımızda da aynı şey olur.
Bununla birlikte, a’yı global olarak ilan edersek, tüm referans ve atamalar global a’ya gider. Benzer şekilde, b değişkenini yeniden hatırlatmak istiyorsak, yerel olmayan olarak bildirilmelidir. Aşağıdaki örnek bunu daha da netleştirecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def dis_function(): a = 20 def ic_function(): a = 30 print('a =',a) ic_function() print('a =',a) a = 10 dis_function() print('a =',a) |
Çıktı:
1 2 3 4 5 | a = 30 a = 20 a = 10 |
Bu programda, üç farklı değişken a ayrı ad alanlarında tanımlanır ve buna göre erişilir. Aşağıdaki programdayken,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def dis_function(): global a a = 20 def ic_function(): global a a = 30 print('a =',a) ic_function() print('a =',a) a = 10 dis_function() print('a =',a) |
Çıktı:
1 2 3 4 5 | a = 30 a = 30 a = 30 |
Burada, tüm referans ve atamalar, global anahtar kelimesinin kullanımı nedeniyle küreseldir.
2 Yorum