logo

Imenski prostor u Pythonu

U ovom vodiču naučit ćemo o prostoru imena u Pythonu, strukturi koja se koristi za organiziranje simboličkih imena dodijeljenih objektima u programu Python, zašto je prostor imena važan i kako ih možemo koristiti u našem programu Python. Imajmo kratki uvod u imenski prostor.

Što je Namespace?

U Pythonu, način da se svakom objektu da jedinstveno ime je kroz imenski prostor. Varijable i metode primjeri su objekata u Pythonu. Drugim riječima, to je zbirka poznatih simboličnih imena i detalja o stvari na koju se svako ime odnosi. Naziv se može smatrati ključem u rječniku, a objekti su vrijednosti u prostoru imena. Trebali bismo to shvatiti s originalnim modelom - imenski prostor nalikuje prezimenu. Ako postoji više imena 'Peter' u razredu, može biti teško locirati ime 'Peter'; međutim, kada izričito tražimo 'Peter Warner' ili 'Peter Cummins,' u razredu, možda nije uobičajeno da više učenika ima isto ime i prezime.

Python tumač može bolje razumjeti točnu metodu ili varijablu u kodu zahvaljujući prostoru imena. Kao rezultat toga, njegovo ime sadrži dodatne informacije, uključujući prostor (povezano s opsegom) i naziv, koji označava jedinstveni identifikator.

U Pythonu postoje četiri vrste imenskih prostora koji su navedeni u nastavku.

  • Ugrađeni
  • Globalno
  • Ograđivanje
  • Lokalno

Budući da ovi razni prostori imena imaju vijek trajanja, Python tumač stvara prostore imena prema potrebi i briše ih kada više nisu potrebni.

Hajdemo razumjeti različite vrste prostora imena u Pythonu.

Ugrađeni prostor imena

Kao što mu ime sugerira, sadrži unaprijed definirana imena svih Python ugrađenih objekata koji su već dostupni u Pythonu. Ispišimo ta imena sljedećom naredbom.

tigar u usporedbi s lavom

Otvorite Python terminal i upišite sljedeću naredbu.

Naredba -

 dir(__builtins__) 

Izlaz:

 ['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'] 

Ugrađeni prostor imena stvara Python tumač kada se pokrene. One se prekidaju kada Python interpreter prekine rad.

Globalni imenski prostor

Globalni imenski prostor sastoji se od bilo kojeg imena u Pythonu na bilo kojoj razini glavnog programa. Stvara se kada se glavno tijelo izvrši i ostaje u postojanju dok tumač ne završi.

Python tumač stvara globalni imenski prostor za bilo koji modul koji naš Python učitava s import naredbom. Za više informacija posjetite naš Python modul.

niz je prazan

Lokalni i okružujući prostori imena

Lokalne imenske prostore koristi funkcija; Kada se funkcija pokrene, Python tumač stvara novi prostor imena. Lokalni prostori imena nastavljaju postojati nakon završetka rada funkcije. Sposobnost se također može sastojati od druge sposobnosti. Kao što je prikazano u nastavku, možemo definirati jednu funkciju unutar druge.

Primjer -

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

U gornjem modelu, sposobnost g() je karakterizirana unutar kolekcije f(). Pozvali smo funkciju g() unutar funkcije f() i glavnu funkciju f(). Pogledajmo kako gornja funkcija radi:

  • Python stvara novi prostor imena za f() kada ga pozovemo.
  • Slično, f() poziva g(), g() dobiva svoj drugačiji prostor imena.
  • Lokalni imenski prostor g() stvoren je za okružujući imenski prostor, f().

Svaki od ovih imenskih prostora se završava kada se funkcija završava.

Opseg objekta/varijable

Pojam 'opseg' specificira kojoj se regiji kodiranja određenog Python objekta može pristupiti. Svaki objekt i varijabla ima opseg u programu iz kojeg možemo pristupiti toj varijabli. Na primjer, funkcijskoj varijabli može se pristupiti samo unutar funkcije. Pogledajmo sljedeću ilustraciju:

Primjer -

 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() 

Izlaz:

 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 imenski rječnici

U prethodnom vodiču govorili smo o tome kako su prostori imena poput rječnika, s ključevima koji predstavljaju imena objekata, a vrijednostima koje predstavljaju stvarne objekte. Kao rječnike, Python koristi i globalne i lokalne imenske prostore. Pristup globalnim i lokalnim rječnicima imenskog prostora omogućen je Pythonovim metodama globals() i locals().

redak i stupac

Metoda globals().

Metoda globals() vraća referencu na trenutni rječnik globalnog imenskog prostora. Možemo ga koristiti za pristup objektima u globalnom imenskom prostoru. Pogledajmo donji primjer.

Primjer -

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

Kao što vidimo, postoji mnogo ugrađenih unosa globali() metoda. Može se razlikovati ovisno o vašem operativnom sustavu i verziji Pythona. Sada definirajmo globalnu varijablu i promatrajmo razlike.

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

Nakon dodjele a = 20, nova globalna varijabla dodijeljena globalnom rječniku imenskog prostora. Možemo pristupiti vrijednostima kao što pristupamo u rječnicima. Pogledajmo donji primjer.

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

Vrijednost rječnika možemo izmijeniti pomoću funkcije globals().

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

Sada će se nova vrijednost a pojaviti u globalnim rječnicima.

Funkcija locals().

Python također nudi metodu locals() sličnu globals(), ali umjesto toga pristupa objektima u lokalnom imenskom prostoru. Pogledajmo sljedeći primjer.

Primjer -

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

Kada pozovemo func(10, 20), locals() vraća rječnik koji predstavlja lokalni imenski prostor funkcije. U opsegu funkcije definirali smo lokalnu varijablu str1; lokalni imenski prostor uključivao je argumente funkcije jer su oni lokalni za func().

Bez obzira na to, kada zovemo mogućnost local people(), ona djeluje jednako sposobnosti globals(). Funkcije globals() i locals() malo se razlikuju. Funkcija globals() ne samo da definira dodatne varijable, već i pohranjuje povratnu vrijednost. Rječnik će sadržavati nove varijable i njihove vrijednosti. Pogledajte primjer u nastavku.

Primjer -

 >>> 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'} 

Ovdje je glob_var je referenca na globalni rječnik imenskog prostora. Nove izjave o dodjeli x i i pojavio u glob_var rječnik.

Mijenjanje varijabli izvan opsega

U pozivnom okruženju funkcija može promijeniti argument prosljeđivanjem različite vrijednosti, ali ponekad ne može promijeniti vrijednost.

powershell višeredni komentar

Funkcija ne može mijenjati nepromjenjivi argument.

Promjenjivi argument može se promijeniti na mjestu, ali se ne može potpuno redefinirati.

Razumimo sljedeći scenarij.

Primjer -

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

Izlaz:

 40 20 

Definiramo globalnu varijablu x = 20 i također u funkciji s istim imenom. Kada se func() izvrši, stvara novu referencu lokalne varijable na cjelobrojni objekt čija je vrijednost 40. Unutar func() tijelo, naredba dodjele neće utjecati na globalni objekt.

Međutim, funkcija može modificirati objekt promjenjivog tipa izvan svog lokalnog opsega. Razumimo primjer u nastavku.

Primjer -

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

My_list je popis i promjenjivog je tipa. Func() se može mijenjati unutar my_list iako je izvan lokalnog opsega. Ali, ako pokušamo ponovno dodijeliti my_list, to će stvoriti novi lokalni objekt i neće modificirati globalni my_list. Pogledajmo donji primjer.

Primjer -

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

Izlaz:

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

Zaključak

Vodimo računa o prostoru imena, načinu na koji ga možemo koristiti i stupnju varijable. Brojni različiti objekti mogu se stvoriti kratkim Python programom. Ovaj broj može premašiti tisuću u kompliciranom Python programu. Python imenski prostor olakšava tumaču da zapamti imena tih objekata.