Jump to content

Python

  • entries
    66
  • comments
    0
  • views
    25,490

Namespace ve Scope


Doğuhan ELMA

141 views

Python'daki "scope" ve "namespace" kavramları, değişkenlerin, fonksiyonların ve diğer objelerin isimlerinin nasıl düzenlendiği ve nasıl erişilebildiği ile ilgilidir.

Namespace: Python'da bir namespace, isimlerin (yani değişkenlerin, fonksiyonların, sınıfların vb.) saklandığı bir alandır. Namespace'ler, kodun farklı bölümlerinde aynı isimleri farklı şekillerde kullanabilmenizi sağlar. Örneğin, bir fonksiyon içinde x adında bir değişken oluşturabilirsiniz ve aynı zamanda başka bir fonksiyonda veya ana programda da x adında başka bir değişken oluşturabilirsiniz. Bu iki x değişkeni aynı isme sahip olsa da, farklı namespace'lerde yer alırlar ve birbirinden bağımsızdırlar.

Python'da birkaç farklı türde namespace bulunur:

Global Namespace: Bir Python dosyası (veya script) içinde tanımlanan isimlerin saklandığı namespace'dir. Bu isimlere scriptin her yerinden erişilebilir.

Local Namespace: Bir fonksiyon veya metot içinde tanımlanan isimlerin saklandığı namespace'dir. Bu isimlere sadece tanımlandıkları fonksiyon içinden erişilebilir.

Built-in Namespace: Python dilinin önceden tanımlanmış isimlerinin (örneğin print, len gibi) saklandığı namespace'dir. Bu isimlere programın her yerinden erişilebilir.

 

Scope: Python'da bir scope, bir namespace'e erişim alanını belirler. Bir değişkenin, fonksiyonun veya objenin scope'u, o ismi kullanabileceğiniz kodun parçasını belirler. Python'da dört tür scope bulunur:

Local Scope: Bir fonksiyon içinde tanımlanan değişkenlerin veya objelerin scope'u local'dir. Yani bu değişkenlere sadece tanımlandıkları fonksiyon içinden erişilebilir.

Enclosing Scope: Bir fonksiyonu çevreleyen (yani içeren) diğer fonksiyonlar tarafından tanımlanan değişkenlerin veya objelerin scope'u enclosing'dir. Yani bir iç fonksiyon, dış fonksiyonundaki değişkenlere erişebilir.

Global Scope: Bir Python dosyasının en üst düzeyinde (yani herhangi bir fonksiyon veya sınıf içinde olmayan) tanımlanan değişkenlerin veya objelerin scope'u global'dir. Bu değişkenlere dosyanın her yerinden erişilebilir.

Built-in Scope: Python dilinin önceden tanımlanmış isimlerinin scope'u built-in'dir. Bu isimlere programın her yerinden erişilebilir.

Python'daki scope ve namespace kavramları, kodunuzun doğru bir şekilde çalışmasını sağlar ve aynı isimlerin farklı yerlerde farklı değerlere sahip olabilmesini sağlar.

 

Öncelikle global ve local scope örneklerine bakalım:

# Bu bir global değişken
x = "global x"

def test_function():
    # Bu bir local değişken
    y = "local y"
    print(y)
    # Global değişkeni burada erişebiliriz
    print(x)

test_function()

# local değişkeni burada kullanamayız, çünkü y'nin scope'u test_function içinde
# print(y)  # Bu satır hata verir 

# x'in scope'u global olduğu için burada erişebiliriz
print(x)

Bir de enclosing scope örneğine bakalım:

# Bu bir global değişken
x = "global x"

def outer():
    # outer fonksiyonu içinde, bu bir nonlocal değişken (enclosing scope)
    x = "outer x"

    def inner():
        # inner fonksiyonu içinde, bu bir local değişken
        x = "inner x"
        print(x)

    inner()
    print(x)

outer()
print(x)

Bu örnekte, inner() fonksiyonu kendi local x'ini, outer() fonksiyonu kendi local (burada nonlocal olarak da adlandırılır) x'ini ve global x ayrı ayrı tanımlar. Her biri kendi scope'unda geçerlidir ve birbirlerini etkilemezler.

Son olarak built-in scope örneğine bakalım. Python'da built-in fonksiyonlar ve değişkenler vardır ve bunlar her zaman her yerde erişilebilir. Ancak eğer aynı isimde başka bir değişken veya fonksiyon tanımlarsak, built-in olanı geçersiz kılar (override) ve kendi tanımladığımızı kullanırız:

# Normalde len, Python'ın built-in bir fonksiyonu ve her yerden erişilebilir.
print(len([1, 2, 3]))

# Ancak eğer len diye bir değişken tanımlarsak:
len = "Now len is a string"
# Artık len fonksiyonunu kullanamayız, çünkü len artık bir string.
# print(len([1, 2, 3]))  # Bu satır hata verir.

Bu örnekte, built-in len fonksiyonu yerine len isimli bir string tanımladık, ve artık len fonksiyonunu kullanamayız. Bu nedenle genellikle built-in isimlerin üzerine yazmayı (override) kaçınmalıyız

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...