logo

Menný priestor v Pythone

V tomto návode sa dozvieme o mennom priestore v Pythone, štruktúre používanej na organizáciu symbolických mien priradených objektom v programe Python, prečo je menný priestor dôležitý a ako ich môžeme použiť v našom programe Python. Urobme krátky úvod do menného priestoru.

Čo je Namespace?

V Pythone je spôsob, ako dať každému objektu jedinečný názov, prostredníctvom menného priestoru. Premenné a metódy sú príklady objektov v Pythone. Inak povedané, je to zbierka známych symbolických mien a podrobností o veci, na ktorú sa každé meno vzťahuje. Názov možno považovať za kľúč v slovníku a objekty sú hodnoty v priestore názvov. Mali by sme na to prísť so skutočným modelom – Menný priestor pripomína priezvisko. Ak je v triede viacero mien 'Peter', môže byť ťažké nájsť meno 'Peter'; keď však konkrétne požadujeme „Peter Warner“ alebo „Peter Cummins“, v triede nemusí byť bežné, aby viacero študentov malo rovnaké meno a priezvisko.

Interpret Pythonu môže vďaka mennému priestoru lepšie pochopiť presnú metódu alebo premennú v kóde. Výsledkom je, že jeho názov obsahuje ďalšie informácie vrátane priestoru (týkajúceho sa rozsahu) a názvu, ktorý označuje jedinečný identifikátor.

V Pythone existujú štyri typy menných priestorov, ktoré sú uvedené nižšie.

  • Vstavaný
  • globálne
  • Uzavretie
  • Miestne

Keďže tieto rôzne menné priestory majú životnosť, Python interpret vytvára menné priestory podľa potreby a vymaže ich, keď už nie sú potrebné.

Poďme pochopiť rôzne typy menného priestoru v Pythone.

Vstavaný priestor názvov

Ako už názov napovedá, obsahuje preddefinované názvy všetkých vstavaných objektov Pythonu, ktoré sú už v Pythone k dispozícii. Vypíšme tieto mená pomocou nasledujúceho príkazu.

Otvorte terminál Python a zadajte nasledujúci príkaz.

príkaz -

 dir(__builtins__) 

Výkon:

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

Vstavaný menný priestor vytvára interpret Pythonu pri jeho spustení. Tieto sú ukončené, keď sa ukončí interpret Pythonu.

Globálny priestor názvov

Globálny menný priestor pozostáva z ľubovoľných mien v Pythone na akejkoľvek úrovni hlavného programu. Vytvára sa pri spustení hlavného tela a zostáva v existencii, kým sa tlmočník neukončí.

Interpret Pythonu vytvára globálny priestor názvov pre akýkoľvek modul, ktorý náš Python načíta príkazom import. Ak chcete získať viac informácií, navštívte náš modul Python.

Miestne a uzavreté menné priestory

Funkcia používa lokálne menné priestory; Keď je funkcia spustená, interpret Pythonu vytvorí nový priestor názvov. Lokálne priestory názvov naďalej existujú aj po dokončení funkcie. Schopnosť môže tiež obsahovať inú schopnosť. Ako je uvedené nižšie, môžeme definovať jednu funkciu v rámci druhej.

Príklad -

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

Vo vyššie uvedenom modeli je schopnosť g() charakterizovaná vnútri kolekcie f(). Nazvali sme funkciu g() v rámci funkcie f() a hlavnej funkcie f(). Pozrime sa, ako funguje vyššie uvedená funkcia:

  • Python vytvorí nový menný priestor pre f(), keď ho zavoláme.
  • Podobne f() volá g(), g() dostane svoj vlastný odlišný menný priestor.
  • Lokálny menný priestor g() bol vytvorený pre obklopujúci menný priestor f().

Každý z týchto menných priestorov je ukončený, keď je funkcia ukončená.

Rozsah objektu/premennej

Pojem 'rozsah' špecifikuje, ku ktorej kódovacej oblasti konkrétneho objektu Python je možné pristupovať. Každý objekt a premenná má v programe rozsah, z ktorého môžeme k danej premennej pristupovať. Napríklad k funkčnej premennej je možné pristupovať iba v rámci funkcie. Pozrime sa na nasledujúcu ilustráciu:

Príklad -

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

Výkon:

 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 

Slovníky menného priestoru Pythonu

V predchádzajúcom návode sme hovorili o tom, ako sú menné priestory ako slovníky, pričom kľúče predstavujú názvy objektov a hodnoty predstavujú skutočné objekty. Ako slovníky používa Python globálne aj lokálne menné priestory. Prístup ku globálnym a lokálnym slovníkom menného priestoru umožňujú metódy globals() a locals() Pythonu.

Metóda globals().

Metóda globals() vracia odkaz na aktuálny slovník globálneho priestoru názvov. Môžeme ho použiť na prístup k objektom v globálnom mennom priestore. Pozrime sa na príklad nižšie.

Príklad -

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

Ako vidíme, existuje veľa vstavaných záznamov globals() metóda. Môže sa líšiť v závislosti od vášho operačného systému a verzie Pythonu. Teraz definujme globálnu premennú a pozorujme rozdiely.

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

Po priradení a = 20 nová globálna premenná priradená globálnemu slovníku menného priestoru. K hodnotám môžeme pristupovať tak, ako k nim pristupujeme v slovníkoch. Pozrime sa na príklad nižšie.

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

Hodnotu slovníka môžeme upraviť pomocou funkcie globals().

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

Teraz sa v globálnych slovníkoch objavila nová hodnota vôle.

Funkcia locals().

Python tiež poskytuje metódu locals() podobnú globals(), ale namiesto toho pristupuje k objektom v lokálnom priestore názvov. Pozrime sa na nasledujúci príklad.

Príklad -

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

Keď zavoláme funkciu func(10, 20), locals() vráti slovník reprezentujúci lokálny priestor názvov funkcie. V rozsahu funkcie sme definovali lokálnu premennú str1; lokálny menný priestor obsahoval argumenty funkcie, pretože sú lokálne pre func().

Napriek tomu, keď nazývame schopnosť miestnych ľudí (), chová sa ekvivalentne schopnosti globals (). Funkcia globals() a funkcia locals() sa mierne líšia. Funkcia globals() nielen definuje ďalšie premenné, ale aj ukladá návratovú hodnotu. Slovník bude obsahovať nové premenné a ich hodnoty. Pozrite si príklad nižšie.

Príklad -

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

Tu je glob_var je odkaz na globálny slovník menného priestoru. Nové príkazy na zadanie X a a sa objavil v glob_var slovník.

Zmena premenných mimo rozsahu

V prostredí volania môže funkcia zmeniť argument odovzdaním inej hodnoty, ale niekedy nemôže zmeniť hodnotu.

Nemenný argument nemôže byť modifikovaný funkciou.

Meniteľný argument možno zmeniť na mieste, ale nemožno ho úplne predefinovať.

Poďme pochopiť nasledujúci scenár.

instanceof v jazyku Java

Príklad -

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

Výkon:

 40 20 

Definujeme globálnu premennú x = 20 a tiež vo funkcii s rovnakým názvom. Keď sa func() spustí, vytvorí novú lokálnu premennú odkaz na celočíselný objekt, ktorého hodnota je 40. func() telo, príkaz priradenia neovplyvní globálny objekt.

Funkcia však môže modifikovať objekt meniteľného typu mimo svojho lokálneho rozsahu. Poďme pochopiť nižšie uvedený príklad.

Príklad -

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

My_list je zoznam a má meniteľný typ. Funkcia func() môže upravovať v rámci my_list, aj keď je mimo lokálneho rozsahu. Ak sa však pokúsime zmeniť priradenie my_list, vytvorí sa nový lokálny objekt a nezmení sa globálny my_list. Pozrime sa na príklad nižšie.

Príklad -

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

Výkon:

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

Záver

Postaráme sa o menný priestor, ako ho môžeme využiť a stupeň premennej. Pomocou krátkeho programu Python je možné vytvoriť množstvo rôznych objektov. Toto číslo môže v komplikovanom programe Python prekročiť tisíc. Menný priestor Pythonu uľahčuje tlmočníkovi zapamätať si mená týchto objektov.