V tej vadnici bomo spoznali imenski prostor v Pythonu, strukturo, ki se uporablja za organiziranje simbolnih imen, dodeljenih predmetom v programu Python, zakaj je imenski prostor pomemben in kako jih lahko uporabimo v našem programu Python. Oglejmo si kratek uvod v imenski prostor.
Kaj je imenski prostor?
V Pythonu lahko vsakemu objektu damo edinstveno ime prek imenskega prostora. Spremenljivke in metode so primeri objektov v Pythonu. Povedano drugače, gre za zbirko znanih simboličnih imen in podrobnosti o stvari, na katero se vsako ime nanaša. Ime si lahko predstavljamo kot ključ v slovarju, objekti pa so vrednosti v imenskem prostoru. To bi morali ugotoviti s pristnim modelom - imenski prostor je podoben priimku. Če je v razredu več imen 'Peter', bo morda težko najti ime 'Peter'; ko pa izrecno zahtevamo 'Peter Warner' ali 'Peter Cummins,' v razredu morda ni običajno, da ima več učencev isto ime in priimek.
Tolmač Python lahko zaradi imenskega prostora bolje razume točno metodo ali spremenljivko v kodi. Posledično njegovo ime vsebuje dodatne informacije, vključno s prostorom (v zvezi z obsegom) in imenom, ki označuje edinstven identifikator.
V Pythonu obstajajo štiri vrste imenskih prostorov, ki so navedeni spodaj.
- Vgrajena
- Globalno
- Zapiranje
- Lokalno
Ker imajo različni imenski prostori življenjsko dobo, tolmač Python po potrebi ustvari imenske prostore in jih izbriše, ko niso več potrebni.
npr. uporabniško ime
Razumejmo različne vrste imenskega prostora v Pythonu.
Vgrajeni imenski prostor
Kot pove že ime, vsebuje vnaprej določena imena vseh Pythonovih vgrajenih predmetov, ki so že na voljo v Pythonu. Naštejmo ta imena z naslednjim ukazom.
Odprite terminal Python in vnesite naslednji ukaz.
Ukaz -
dir(__builtins__)
Izhod:
['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']
Vgrajeni imenski prostor ustvari tolmač Python, ko se zažene. Ti se prekinejo, ko se prekine tolmač Python.
Globalni imenski prostor
Globalni imenski prostor je sestavljen iz vseh imen v Pythonu na kateri koli ravni glavnega programa. Ustvari se, ko se izvrši glavno telo, in obstaja, dokler se tolmač ne zaključi.
Tolmač Python ustvari globalni imenski prostor za vsak modul, ki ga naš Python naloži s stavkom import. Za več informacij obiščite naš modul Python.
Lokalni in oklepni imenski prostori
Lokalne imenske prostore uporablja funkcija; Ko se funkcija zažene, tolmač Python ustvari nov imenski prostor. Lokalni imenski prostori še naprej obstajajo, ko se funkcija konča z izvajanjem. Zmogljivost je lahko prav tako sestavljena iz druge zmogljivosti. Kot je prikazano spodaj, lahko definiramo eno funkcijo znotraj druge.
Primer -
def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f()
V zgornjem modelu je zmogljivost g() opisana znotraj zbirke f(). Poklicali smo funkcijo g() znotraj funkcije f() in glavno funkcijo f(). Poglejmo, kako deluje zgornja funkcija:
- Python ustvari nov imenski prostor za f(), ko ga pokličemo.
- Podobno f() kliče g(), g() dobi svoj drugačen imenski prostor.
- Lokalni imenski prostor g() je bil ustvarjen za obdajajoči imenski prostor f().
Vsak od teh imenskih prostorov se konča, ko se funkcija konča.
Obseg predmeta/spremenljivke
Izraz 'obseg' določa, do katere kodirne regije določenega predmeta Python je mogoče dostopati. Vsak objekt in spremenljivka ima v programu obseg, iz katerega lahko dostopamo do te spremenljivke. Na primer, do spremenljivke funkcije je mogoče dostopati samo znotraj funkcije. Oglejmo si naslednjo ilustracijo:
java za rezanje nizov
Primer -
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()
Izhod:
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
Slovarji imenskega prostora Python
V prejšnji vadnici smo govorili o tem, da so imenski prostori podobni slovarjem, pri čemer ključi predstavljajo imena objektov in vrednosti, ki predstavljajo dejanske objekte. Python kot slovarje uporablja globalne in lokalne imenske prostore. Dostop do slovarjev globalnega in lokalnega imenskega prostora omogočata Pythonovi metodi globals() in locals().
Metoda globals().
Metoda globals() vrne sklic na trenutni slovar globalnega imenskega prostora. Uporabimo ga lahko za dostop do objektov v globalnem imenskem prostoru. Oglejmo si spodnji primer.
Primer -
>>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
Kot lahko vidimo, je veliko vgrajenih vnosov globali() metoda. Lahko se razlikuje glede na vaš operacijski sistem in različico Pythona. Zdaj pa definirajmo globalno spremenljivko in opazujmo razlike.
git rebase
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20}
Po dodelitvi a = 20 je nova globalna spremenljivka dodeljena globalnemu slovarju imenskega prostora. Do vrednosti lahko dostopamo tako, kot dostopamo v slovarjih. Oglejmo si spodnji primer.
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20
Vrednost slovarja lahko spremenimo s funkcijo globals().
>>> globals()['a'] = 100 >>> a 100
Zdaj bo nova vrednost a prikazana v globalnih slovarjih.
Funkcija locals().
Python ponuja tudi metodo locals(), ki je podobna globals(), vendar namesto tega dostopa do objektov v lokalnem imenskem prostoru. Poglejmo naslednji primer.
Primer -
>>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'}
Ko pokličemo func(10, 20), locals() vrne slovar, ki predstavlja lokalni imenski prostor funkcije. V obsegu funkcije smo definirali lokalno spremenljivko str1; lokalni imenski prostor je vključeval argumente funkcije, ker so lokalni za func().
Ne glede na to, ko imenujemo zmožnost local people(), deluje enako kot zmožnost globals(). Funkciji globals() in locals() se nekoliko razlikujeta. Funkcija globals() ne definira samo dodatnih spremenljivk, ampak tudi shrani vrnjeno vrednost. Slovar bo vseboval nove spremenljivke in njihove vrednosti. Oglejte si spodnji primer.
Primer -
>>> 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'}
Tukaj je glob_var je sklic na slovar globalnega imenskega prostora. Nove izjave o dodelitvi x in in pojavil v glob_var slovar.
Spreminjanje spremenljivk izven obsega
V klicnem okolju lahko funkcija spremeni argument tako, da posreduje drugo vrednost, vendar včasih ne more spremeniti vrednosti.
če po povzetku Rudyarda Kiplinga
Nespremenljivega argumenta ne more spremeniti funkcija.
Spremenljiv argument je mogoče spremeniti na mestu, vendar ga ni mogoče popolnoma na novo definirati.
Razumejmo naslednji scenarij.
Primer -
x = 20 def func(): x = 40 print(x) func() print(x)
Izhod:
40 20
Definiramo globalno spremenljivko x = 20 in tudi v funkciji z istim imenom. Ko se func() izvede, ustvari novo referenco lokalne spremenljivke na celoštevilski objekt, katerega vrednost je 40. Znotraj func() telo, stavek o dodelitvi ne bo vplival na globalni objekt.
Vendar pa lahko funkcija spremeni objekt spremenljivega tipa zunaj svojega lokalnega obsega. Razumejmo spodnji primer.
zemljevid java
Primer -
my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func())
My_list je seznam in je spremenljive vrste. Func() se lahko spreminja znotraj my_list, čeprav je zunaj lokalnega obsega. Vendar, če poskušamo znova dodeliti my_list, bo ustvaril nov lokalni objekt in ne bo spremenil globalnega my_list. Oglejmo si spodnji primer.
Primer -
my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func())
Izhod:
['A', 'B', 'C', 'D', 'E']
Zaključek
Poskrbimo za imenski prostor, kako ga lahko uporabimo in stopnjo spremenljivke. S kratkim programom Python je mogoče ustvariti številne različne predmete. To število lahko v zapletenem programu Python preseže tisoč. Imenski prostor Python olajša tolmaču, da si zapomni imena teh objektov.