logo

Jmenný prostor v Pythonu

V tomto tutoriálu se dozvíme o jmenném prostoru v Pythonu, struktuře používané k uspořádání symbolických jmen přiřazených objektům v programu Python, proč je jmenný prostor důležitý a jak je můžeme použít v našem programu Python. Pojďme si krátce představit jmenný prostor.

Co je jmenný prostor?

V Pythonu je způsob, jak dát každému objektu jedinečný název, prostřednictvím jmenného prostoru. Proměnné a metody jsou příklady objektů v Pythonu. Jinými slovy, je to sbírka známých symbolických jmen a podrobností o věci, na kterou každé jméno odkazuje. Název lze považovat za klíč ve slovníku a objekty jsou hodnoty v prostoru názvů. Měli bychom na to přijít se skutečným modelem – jmenný prostor připomíná příjmení. Pokud je ve třídě více jmen 'Petr', může být obtížné najít jméno 'Petr'; když však konkrétně požadujeme „Peter Warner“ nebo „Peter Cummins“, ve třídě nemusí být běžné, aby více studentů mělo stejné jméno a příjmení.

Interpret Pythonu může díky jmennému prostoru lépe porozumět přesné metodě nebo proměnné v kódu. Výsledkem je, že jeho název obsahuje další informace, včetně prostoru (související s rozsahem) a názvu, který označuje jedinečný identifikátor.

V Pythonu existují čtyři typy jmenných prostorů, které jsou uvedeny níže.

c# slovník
  • Vestavěný
  • Globální
  • Uzavření
  • Místní

Protože tyto různé jmenné prostory mají životnost, interpret Pythonu vytváří jmenné prostory podle potřeby a maže je, když již nejsou potřeba.

Pojďme pochopit různé typy jmenných prostorů v Pythonu.

Vestavěný jmenný prostor

Jak jeho název napovídá, obsahuje předdefinovaná jména všech vestavěných objektů Pythonu, které jsou již v Pythonu k dispozici. Vypišme tato jména pomocí následujícího příkazu.

Otevřete terminál Pythonu a zadejte následující příkaz.

příkaz -

 dir(__builtins__) 

Výstup:

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

Vestavěný jmenný prostor vytváří interpret Pythonu při jeho spuštění. Ty jsou ukončeny, když se ukončí interpret Pythonu.

Globální jmenný prostor

Globální jmenný prostor se skládá z libovolných jmen v Pythonu na jakékoli úrovni hlavního programu. Je vytvořen, když se provádí hlavní tělo, a zůstává v existenci, dokud interpret neskončí.

Interpret Pythonu vytvoří globální jmenný prostor pro jakýkoli modul, který náš Python načte pomocí příkazu import. Chcete-li získat více informací, navštivte náš modul Python.

Místní a obklopující jmenné prostory

Funkce používá místní jmenné prostory; Když je funkce spuštěna, interpret Pythonu vytvoří nový jmenný prostor. Lokální obory názvů nadále existují i ​​po dokončení funkce. Schopnost může rovněž zahrnovat jinou schopnost. Jak je ukázáno níže, můžeme definovat jednu funkci v jiné.

Příklad -

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

Ve výše uvedeném modelu je schopnost g() charakterizována uvnitř kolekce f(). Volali jsme funkci g() v rámci funkce f() a hlavní funkce f(). Podívejme se, jak výše uvedená funkce funguje:

  • Python vytvoří nový jmenný prostor pro f(), když jej zavoláme.
  • Podobně f() volá g(), g() dostane svůj vlastní odlišný jmenný prostor.
  • Místní jmenný prostor g() byl vytvořen pro obklopující jmenný prostor f().

Každý z těchto jmenných prostorů je ukončen, když je funkce ukončena.

Rozsah objektu/proměnné

Termín 'rozsah' určuje, ke které kódovací oblasti konkrétního objektu Pythonu lze přistupovat. Každý objekt a proměnná má v programu rozsah, ze kterého můžeme k dané proměnné přistupovat. Například k funkční proměnné lze přistupovat pouze v rámci funkce. Podívejme se na následující ilustraci:

Pří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ýstup:

java převést znak na řetězec
 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 jmenného prostoru Pythonu

V předchozím tutoriálu jsme mluvili o tom, jak jsou jmenné prostory jako slovníky, kde klíče představují názvy objektů a hodnoty představují skutečné objekty. Jako slovníky používá Python globální i lokální jmenné prostory. Přístup ke globálním a lokálním slovníkům jmenného prostoru umožňují metody globals() a locals() Pythonu.

Metoda globals().

Metoda globals() vrací odkaz na aktuální slovník globálního jmenného prostoru. Můžeme jej použít pro přístup k objektům v globálním jmenném prostoru. Podívejme se na níže uvedený příklad.

Příklad -

je prázdná java
 >>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': } 

Jak vidíme, existuje mnoho vestavěných položek globals() metoda. Může se lišit podle vašeho operačního systému a verze Pythonu. Nyní definujme globální proměnnou a pozorujme rozdíly.

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

Po přiřazení a = 20 nová globální proměnná přiřazená globálnímu slovníku jmenného prostoru. K hodnotám můžeme přistupovat stejně jako ve slovnících. Podívejme se na níže uvedený příklad.

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

Hodnotu slovníku můžeme upravit pomocí funkce globals().

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

Nyní se nová hodnota vůle objevila v globálních slovnících.

Funkce locals().

Python také poskytuje metodu locals() podobnou globals(), ale místo toho přistupuje k objektům v místním jmenném prostoru. Podívejme se na následující příklad.

Příklad -

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

Když zavoláme funkci func(10, 20), locals() vrátí slovník představující místní jmenný prostor funkce. V rozsahu funkce jsme definovali lokální proměnnou str1; místní jmenný prostor obsahoval argumenty funkce, protože jsou lokální pro funkci func().

Nehledě na to, že když nazýváme schopnost local people(), chová se ekvivalentně ke schopnosti globals(). Funkce globals() a funkce locals() se mírně liší. Funkce globals() nejen definuje další proměnné, ale také ukládá návratovou hodnotu. Slovník bude obsahovat nové proměnné a jejich hodnoty. Podívejte se na příklad níže.

Pří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'} 

Zde je glob_var je odkaz na globální slovník jmenného prostoru. Nové příkazy přiřazení X a a se objevil v glob_var slovník.

Změna proměnných mimo rozsah

V prostředí volání může funkce změnit argument předáním jiné hodnoty, ale někdy nemůže změnit hodnotu.

Neměnný argument nemůže být upraven funkcí.

Proměnlivý argument lze změnit na místě, ale nelze jej zcela předefinovat.

Pojďme pochopit následující scénář.

Příklad -

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

Výstup:

 40 20 

Definujeme globální proměnnou x = 20 a také ve funkci se stejným názvem. Když se func() spustí, vytvoří novou lokální proměnnou odkaz na celočíselný objekt, jehož hodnota je 40. func() tělo, příkaz přiřazení neovlivní globální objekt.

Funkce však může upravit objekt proměnlivého typu mimo svůj lokální rozsah. Pojďme pochopit níže uvedený příklad.

metoda tostring v Javě

Příklad -

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

My_list je seznam a je proměnlivého typu. Funkce func() může upravovat uvnitř my_list, i když je mimo místní rozsah. Ale pokud se pokusíme znovu přiřadit my_list, vytvoří se nový lokální objekt a nezmění globální my_list. Podívejme se na níže uvedený příklad.

Příklad -

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

Výstup:

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

Závěr

Postaráme se o jmenný prostor, jak jej můžeme využít a stupeň proměnné. Pomocí krátkého programu Python lze vytvořit mnoho různých objektů. Toto číslo může ve složitém programu Python přesáhnout tisíc. Jmenný prostor Pythonu usnadňuje interpretovi zapamatovat si jména těchto objektů.