logo

Python'da ad alanı

Bu dersimizde Python'daki ad alanını, Python programında nesnelere atanan sembolik adları düzenlemek için kullanılan yapıyı, ad alanının neden önemli olduğunu ve bunları Python programımızda nasıl kullanabileceğimizi öğreneceğiz. Ad alanına kısa bir giriş yapalım.

Ad Alanı Nedir?

Python'da her nesneye benzersiz bir ad vermenin yolu, ad alanıdır. Değişkenler ve yöntemler Python'daki nesnelerin örnekleridir. Başka bir deyişle, bilinen sembolik isimlerin ve her ismin işaret ettiği şeye ilişkin detayların bir derlemesidir. Ad, sözlükteki bir anahtar gibi düşünülebilir ve nesneler de ad alanındaki değerlerdir. Bunu gerçek bir modelle çözmeliyiz - Ad alanı soyadına benzer. Sınıfta birden fazla 'Peter' adı varsa, bir 'Peter' adını bulmak zor olabilir; ancak bir sınıfta özellikle 'Peter Warner' veya 'Peter Cummins' talebinde bulunduğumuzda, birden fazla öğrencinin aynı ad ve soyadına sahip olması yaygın bir durum olmayabilir.

Python yorumlayıcısı, ad alanı sayesinde koddaki tam yöntemi veya değişkeni daha iyi anlayabilir. Sonuç olarak adı, benzersiz bir tanımlayıcıyı ifade eden Boşluk (kapsamla ilgili) ve Ad dahil olmak üzere ek bilgiler içerir.

Python'da aşağıda verilen dört tür ad alanı vardır.

  • Yerleşik
  • Küresel
  • Kapalı
  • Yerel

Bu ad alanlarının çeşitli yaşam süreleri olduğundan, Python yorumlayıcısı gerektiği şekilde ad alanları oluşturur ve artık ihtiyaç duyulmadığında bunları siler.

Python'daki çeşitli ad alanı türlerini anlayalım.

Yerleşik Ad Alanı

Adından da anlaşılacağı gibi, Python'da zaten mevcut olan tüm Python yerleşik nesnelerinin önceden tanımlanmış adlarını içerir. Bu isimleri aşağıdaki komutla listeleyelim.

Python terminalini açın ve aşağıdaki komutu yazın.

yoksa bash

Emretmek -

 dir(__builtins__) 

Çıktı:

 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] 

Yerleşik ad alanı, Python yorumlayıcısı başlatıldığında oluşturulur. Python yorumlayıcısı sonlandırıldığında bunlar sonlandırılır.

Küresel Ad Alanı

Global ad alanı, Python'daki ana programın herhangi bir düzeyindeki herhangi bir addan oluşur. Ana gövde çalıştırıldığında oluşturulur ve tercüman sonlandırılıncaya kadar varlığını sürdürür.

Python yorumlayıcısı, Python'umuzun import ifadesi ile yüklediği herhangi bir modül için global bir ad alanı oluşturur. Daha fazla bilgi almak için Python Modülümüzü ziyaret edin.

Yerel ve Çevreleyen Ad Alanları

Yerel ad alanları işlev tarafından kullanılır; İşlev çalıştırıldığında Python yorumlayıcısı yeni bir ad alanı oluşturur. Yerel ad alanları, işlevin çalışması bittikten sonra da var olmaya devam eder. Yetenek aynı şekilde başka bir yetenekten de oluşabilir. Aşağıda gösterildiği gibi, bir işlevi diğerinin içinde tanımlayabiliriz.

Örnek -

 def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f() 

Yukarıdaki modelde g() yeteneği, f() koleksiyonunun içinde karakterize edilir. f() ve ana f() fonksiyonu içinde g() fonksiyonunu çağırdık. Yukarıdaki fonksiyonun nasıl çalıştığına bakalım:

  • Python, f()'ı çağırdığımızda onun için yeni bir ad alanı oluşturur.
  • Benzer şekilde, f() g()'u çağırır, g() kendi farklı ad alanını alır.
  • Yerel ad alanı g(), onu çevreleyen f() ad alanı için oluşturuldu.

Bu ad alanlarının her biri, işlev sonlandırıldığında sonlandırılır.

Nesnenin/Değişkenin Kapsamı

'Kapsam' terimi, belirli bir Python nesnesinin hangi kodlama bölgesine erişilebileceğini belirtir. Programda her nesne ve değişkenin, o değişkene erişebileceğimiz bir kapsamı vardır. Örneğin, bir fonksiyon değişkenine yalnızca fonksiyon içinden erişilebilir. Aşağıdaki çizimi inceleyelim:

Örnek -

 def scope_func(): print('Inside scope_func') def scope_inner_func(): var = 20 print('Inside inner function, value of var:',var) scope_inner_func() print('Try printing var from outer function: ',var) scope_func() 

Çıktı:

 Inside scope_func Inside inner function, value of var: 20 Traceback (most recent call last): File 'd:/Python Project/listproblems.py', line 343, in scope_func() File 'd:/Python Project/listproblems.py', line 342, in scope_func print('Try printing var from outer function: ',var) NameError: name 'var' is not defined 

Python Ad Alanı Sözlükleri

Önceki derste, anahtarların nesne adlarını ve değerlerin gerçek nesneleri temsil ettiği ad alanlarının sözlüklere nasıl benzediğinden bahsetmiştik. Sözlük olarak Python hem global hem de yerel ad alanlarını kullanır. Genel ve yerel ad alanı sözlüklerine erişim Python'un globals() ve locals() yöntemleriyle mümkün olur.

globals() Yöntemi

globals() yöntemi, geçerli genel ad alanı sözlüğüne bir başvuru döndürür. Bunu global ad alanındaki nesnelere erişmek için kullanabiliriz. Aşağıdaki örneği görelim.

Örnek -

 >>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': } 

Gördüğümüz gibi, birçok yerleşik giriş var. küreseller() yöntem. İşletim sisteminize ve Python sürümünüze göre farklılık gösterebilir. Şimdi global değişkeni tanımlayalım ve farklarını gözlemleyelim.

 >>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} 

a = 20'nin atanmasından sonra, global ad alanı sözlüğüne yeni bir global değişken atanır. Sözlüklerde eriştiğimiz değerlere de ulaşabiliyoruz. Aşağıdaki örneği görelim.

 >>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20 

Globals() fonksiyonunu kullanarak sözlük değerini değiştirebiliriz.

 >>> globals()['a'] = 100 >>> a 100 

Artık a'nın yeni değeri küresel sözlüklerde görünecek.

locals() İşlevi

Python ayrıca globals() yöntemine benzer locals() yöntemini de sağlar ancak bunun yerine yerel ad alanındaki nesnelere erişir. Aşağıdaki örneği görelim.

Örnek -

 >>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'} 

func(10, 20) işlevini çağırdığımızda locals() işlevin yerel ad alanını temsil eden sözlüğü döndürür. Fonksiyon kapsamında str1 yerel değişkenini tanımladık; yerel ad alanı, func() için yerel olduklarından işlev bağımsız değişkenlerini içeriyordu.

Ancak local People() yeteneğini çağırdığımızda globals() yeteneğine eşdeğer hareket eder. globals() işlevi ve locals() işlevi biraz farklıdır. globals() işlevi yalnızca ek değişkenleri tanımlamakla kalmaz, aynı zamanda dönüş değerini de saklar. Sözlük yeni değişkenleri ve değerlerini içerecektir. Aşağıdaki örneğe bir göz atın.

Örnek -

 >>> glob_var = globals() >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} >>> x = 100 >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} 

İşte glob_var küresel ad alanı sözlüğüne bir referanstır. Yeni atama açıklamaları X Ve Ve 'da göründü glob_var sözlük.

Kapsam Dışındaki Değişkenlerin Değiştirilmesi

Çağıran ortamda işlev, farklı bir değer ileterek argümanı değiştirebilir, ancak bazen değeri değiştiremez.

Değişmez bir argüman bir fonksiyon tarafından değiştirilemez.

Değişken bir argüman yerinde değiştirilebilir, ancak tamamen yeniden tanımlanamaz.

Aşağıdaki senaryoyu anlayalım.

Örnek -

 x = 20 def func(): x = 40 print(x) func() print(x) 

Çıktı:

pandalar ve numpy
 40 20 

x = 20 şeklinde global bir değişken tanımlıyoruz ve aynı isimde fonksiyonda da tanımlıyoruz. func() yürütüldüğünde, değeri 40 olan bir tamsayı nesnesine yeni yerel değişken referansı oluşturur. işlev() atama ifadesi genel nesneyi etkilemez.

Ancak bir işlev, yerel kapsamı dışında değiştirilebilir türdeki bir nesneyi değiştirebilir. Aşağıdaki örneği anlayalım.

Örnek -

 my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func()) 

My_list bir listedir ve değiştirilebilir türdedir. func() işlevi, yerel kapsamın dışında olsa bile my_list içinde değişiklik yapabilir. Ancak my_list'i yeniden atamayı denersek, yeni yerel nesneyi yaratacak ve global my_list'i değiştirmeyecektir. Aşağıdaki örneği görelim.

Örnek -

 my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func()) 

Çıktı:

 ['A', 'B', 'C', 'D', 'E'] 

Çözüm

Ad alanıyla, onu nasıl kullanabileceğimizle ve değişkenin derecesiyle biz ilgileniriz. Kısa bir Python programıyla çok sayıda farklı nesne oluşturulabilir. Karmaşık bir Python programında bu sayı bini aşabilir. Python ad alanı, yorumlayıcının bu nesnelerin adlarını hatırlamasını kolaylaştırır.