logo

Névtér a Pythonban

Ebben az oktatóanyagban megismerjük a Python névterét, a Python programban az objektumokhoz rendelt szimbolikus nevek rendszerezésére használt struktúrát, azt, hogy miért fontos a névtér, és hogyan használhatjuk őket Python programunkban. Nézzünk egy rövid bevezetést a névtérbe.

Mi az a névtér?

A Pythonban minden objektumnak egyedi nevet adhatunk egy névtéren keresztül. A változók és metódusok példák a Python objektumaira. Másképp fogalmazva, ez az ismert szimbolikus nevek gyűjteménye, és a dolog részletei, amelyekre az egyes nevek utalnak. A név felfogható kulcsnak a szótárban, az objektumok pedig a névtér értékei. Valódi modellel kellene kitalálnunk – A névtér családnévre hasonlít. Ha több 'Péter' név van az osztályban, nehéz lehet egy 'Péter' név megtalálása; ha azonban kifejezetten a „Peter Warner” vagy a „Peter Cummins” szót kérjük, előfordulhat, hogy egy osztályban nem gyakori, hogy több diáknak ugyanaz a kereszt- és vezetékneve.

A Python értelmező a névtérnek köszönhetően jobban megértheti a kód pontos metódusát vagy változóját. Ennek eredményeként a neve további információkat tartalmaz, beleértve a szóközt (a hatókörhöz kapcsolódóan) és a nevet, amely egyedi azonosítót jelöl.

A Pythonban négyféle névter létezik, amelyeket alább adunk meg.

  • Beépített
  • Globális
  • bekerítés
  • Helyi

Mivel ezek a névterek különböző élettartamúak, a Python interpreter szükség szerint névtereket hoz létre, és törli azokat, amikor már nincs rájuk szükség.

Ismerjük meg a Python névtereinek különféle típusait.

A beépített névtér

Ahogy a neve is sugallja, a Python Pythonban már elérhető összes beépített objektumának előre meghatározott nevét tartalmazza. Soroljuk fel ezeket a neveket a következő paranccsal.

Nyissa meg a Python terminált, és írja be a következő parancsot.

Parancs -

 dir(__builtins__) 

Kimenet:

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

A beépített névteret a Python értelmező hozza létre, amikor elindul. Ezek akkor fejeződnek be, amikor a Python interpreter befejeződik.

A globális névtér

A globális névtér a Python bármely nevéből áll a fő program bármely szintjén. Akkor jön létre, amikor a fő törzs végrehajtódik, és addig marad fenn, amíg az értelmező meg nem szűnik.

A Python értelmező létrehoz egy globális névteret minden olyan modul számára, amelyet a Python az import utasítással együtt tölt be. További információért keresse fel Python modulunkat.

mi az a kaptár

A helyi és a bezáró névterek

A függvény a helyi névtereket használja; A függvény futtatásakor a Python értelmező új névteret hoz létre. A helyi névterek a függvény futása után is léteznek. A képesség szintén tartalmazhat egy másik képességet. Ahogy az alábbiakban látható, definiálhatunk egy függvényt a másikon belül.

Példa -

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

A fenti modellben a g() képességet az f() gyűjteményében jellemezzük. Meghívtuk a g() függvényt az f() függvényen belül és a fő f() függvényt. Nézzük meg, hogyan működik a fenti függvény:

  • A Python új névteret hoz létre az f() számára, amikor hívjuk.
  • Hasonlóképpen, az f() hívások g(), g() saját eltérő névteret kap.
  • A g() helyi névteret a körülvevő f() névtérhez hozták létre.

Ezen névterek mindegyike leáll a függvény leállításakor.

Az objektum/változó hatóköre

A „hatókör” kifejezés azt határozza meg, hogy egy adott Python objektum melyik kódolási régiója érhető el. Minden objektumnak és változónak van egy hatóköre a programban, ahonnan elérhetjük az adott változót. Például egy függvényváltozó csak a függvényen belül érhető el. Vizsgáljuk meg a következő illusztrációt:

Példa -

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

Kimenet:

 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 névtér szótárak

Az előző oktatóanyagban arról beszéltünk, hogy a névterek olyanok, mint a szótárak, ahol a kulcsok az objektumneveket, az értékek pedig a tényleges objektumokat reprezentálják. Szótárként a Python globális és helyi névtereket is használ. A globális és helyi névtérszótárak elérését a Python globals() és locals() metódusai teszik lehetővé.

A globals() módszer

A globals() metódus hivatkozást ad vissza az aktuális globális névtér szótárra. Használhatjuk a globális névtér objektumainak elérésére. Lássuk az alábbi példát.

Példa -

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

Amint látjuk, sok beépített bejegyzés található globals() módszer. Az operációs rendszertől és a Python verziótól függően eltérő lehet. Most definiáljuk a globális változót, és figyeljük meg a különbségeket.

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

Az a = 20 hozzárendelése után egy új globális változó hozzárendelve a globális névtér szótárhoz. Az értékeket úgy érhetjük el, ahogy a szótárakból. Lássuk az alábbi példát.

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

A szótári értéket a globals() függvénnyel módosíthatjuk.

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

Most az a lesz új értéke megjelenik a globális szótárakban.

A helyiek() függvény

A Python a globals()-hoz hasonlóan a locals() metódust is biztosítja, de ehelyett a helyi névtér objektumaihoz fér hozzá. Lássuk a következő példát.

java tömb szelet

Példa -

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

A func(10, 20) meghívásakor a locals() a függvény helyi névterét reprezentáló szótárat adja vissza. A függvény hatókörében definiáltuk az str1 helyi változót; a helyi névtér tartalmazta a függvény argumentumait, mivel ezek lokálisak a func() függvényben.

Mindazonáltal, ha a local people() képességet hívjuk, az egyenértékű a globals() képességgel. A globals() függvény és a locals() függvény némileg eltér egymástól. A globals() függvény nemcsak további változókat határoz meg, hanem a visszatérési értéket is tárolja. A szótár tartalmazza az új változókat és azok értékeit. Vessen egy pillantást az alábbi példára.

Példa -

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

Itt a glob_var a globális névtér szótárra való hivatkozás. Az új hozzárendelési nyilatkozatok x és és megjelent a glob_var szótár.

Változók módosítása a hatályon kívül

A hívó környezetben a függvény megváltoztathatja az argumentumot egy másik érték átadásával, de néha nem tudja megváltoztatni az értéket.

A megváltoztathatatlan argumentumot nem módosíthatja függvény.

A változtatható argumentum a helyén megváltoztatható, de nem definiálható teljesen újra.

Értsük meg a következő forgatókönyvet.

Példa -

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

Kimenet:

b+ fa
 40 20 

Definiálunk egy x = 20 globális változót és az azonos nevű függvényt is. Amikor a func() végrehajtja, létrehozza az új helyi változó hivatkozást egy egész objektumra, amelynek értéke 40. func() body, a hozzárendelési utasítás nem lesz hatással a globális objektumra.

Egy függvény azonban módosíthat egy változó típusú objektumot a helyi hatókörén kívül. Értsük meg az alábbi példát.

Példa -

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

A my_list egy lista, és változó típusú. A func() módosítható a my_liston belül, még akkor is, ha kívül esik a helyi hatókörön. De ha megpróbáljuk újra hozzárendelni a my_list-ot, akkor az létrehozza az új helyi objektumot, és nem módosítja a globális my_list-t. Lássuk az alábbi példát.

Példa -

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

Kimenet:

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

Következtetés

Gondoskodunk a névtérről, annak felhasználási módjáról és a változó mértékéről. Számos különböző objektum hozható létre egy rövid Python programmal. Ez a szám meghaladhatja az ezret egy bonyolult Python programban. A Python névtér megkönnyíti az értelmező számára, hogy megjegyezze ezeknek az objektumoknak a nevét.