Python

Python Namespace ve Kapsam

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

Çıktı:

Burada her ikisi de aynı nesneyi ifade eder. İşleri biraz daha ilginç hale getirelim.

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.

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.

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

Burada a değişkeni genel ad alanındadır. Değişken b, dis_function() öğesinin yerel ad alanında ve c, ic_function() öğesinin iç içe yerel ad alanındadır.

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.

Çıktı:

 

Bu programda, üç farklı değişken a ayrı ad alanlarında tanımlanır ve buna göre erişilir. Aşağıdaki programdayken,

Çıktı:

Burada, tüm referans ve atamalar, global anahtar kelimesinin kullanımı nedeniyle küreseldir.

Etiketler

2 Yorum

Yorum yapmak için tıklayın