Tässä opetusohjelmassa opimme Pythonin nimiavaruudesta, rakenteesta, jota käytetään Python-ohjelman objekteille määritettyjen symbolisten nimien järjestämiseen, miksi nimiavaruus on tärkeä ja kuinka voimme käyttää niitä Python-ohjelmassamme. Otetaanpa lyhyt johdatus nimiavaruuteen.
Mikä on nimiavaruus?
Pythonissa tapa antaa jokaiselle objektille yksilöllinen nimi on nimiavaruuden kautta. Muuttujat ja menetelmät ovat esimerkkejä Pythonin objekteista. Toisin sanoen se on kokoelma tunnettuja symbolisia nimiä ja yksityiskohtia asiasta, johon kukin nimi viittaa. Nimeä voidaan pitää avaimena sanakirjassa, ja objektit ovat arvoja nimiavaruudessa. Meidän pitäisi selvittää se aidolla mallilla - Nimiavaruus muistuttaa sukunimeä. Jos luokassa on useita 'Peter'-nimiä, 'Peter'-nimen löytäminen voi olla vaikeaa; Kuitenkin, kun pyydämme nimenomaan 'Peter Warner' tai 'Peter Cummins', luokassa ei välttämättä ole yleistä, että useilla oppilailla on sama etu- ja sukunimi.
gimp vaihtaa väriä
Python-tulkki voi ymmärtää paremmin koodin tarkan menetelmän tai muuttujan nimitilan ansiosta. Tämän seurauksena sen nimi sisältää lisätietoja, mukaan lukien välilyönti (laajuuteen liittyvä) ja nimi, joka ilmaisee yksilöllisen tunnisteen.
Pythonissa on neljän tyyppisiä nimiavaruuksia, jotka on annettu alla.
- Sisäänrakennettu
- Maailmanlaajuinen
- sulkeva
- Paikallinen
Koska näillä nimiavaruuksilla on eri elinikä, Python-tulkki luo nimiavaruuksia tarpeen mukaan ja poistaa ne, kun niitä ei enää tarvita.
Ymmärretään Pythonin erityyppiset nimiavaruudet.
Sisäänrakennettu nimiavaruus
Kuten sen nimestä voi päätellä, se sisältää ennalta määritetyt nimet kaikille Pythonin sisäänrakennetuille objekteille, jotka ovat jo saatavilla Pythonissa. Listataan nämä nimet seuraavalla komennolla.
Avaa Python-pääte ja kirjoita seuraava komento.
Komento -
dir(__builtins__)
Lähtö:
['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']
Python-tulkki luo sisäänrakennetun nimitilan, kun se käynnistyy. Nämä lopetetaan, kun Python-tulkki päättyy.
Maailmanlaajuinen nimiavaruus
Globaali nimiavaruus koostuu kaikista Pythonin nimistä pääohjelman millä tahansa tasolla. Se luodaan, kun päärunko suoritetaan ja pysyy olemassa, kunnes tulkki lopettaa.
poista viimeinen commit git
Python-tulkki luo globaalin nimiavaruuden mille tahansa moduulille, jonka Python lataa tuontikäskyn kanssa. Saat lisätietoja vierailemalla Python-moduulissamme.
Paikalliset ja sulkevat nimiavaruudet
Funktio käyttää paikallisia nimiavaruuksia; Kun toiminto suoritetaan, Python-tulkki luo uuden nimitilan. Paikalliset nimitilat ovat edelleen olemassa funktion suorittamisen jälkeen. Kyky voi samoin käsittää toisen kyvyn. Kuten alla näytetään, voimme määritellä yhden funktion toisessa.
Esimerkki -
def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f()
Yllä olevassa mallissa ominaisuus g() on karakterisoitu joukossa f(). Kutsuimme g()-funktiota f()-funktiossa ja pääfunktiota f()-funktiossa. Katsotaanpa, miten yllä oleva toiminto toimii:
- Python luo uuden nimiavaruuden f():lle, kun kutsumme sitä.
- Samoin f()-kutsut g(), g() saa oman eri nimiavaruutensa.
- Paikallinen nimiavaruus g() luotiin ympäröivälle nimiavaruudelle f().
Jokainen näistä nimiavaruuksista päätetään, kun toiminto lopetetaan.
Objektin/muuttujan laajuus
Termi 'scope' määrittää, mihin tietyn Python-objektin koodausalueeseen voidaan päästä. Jokaisella objektilla ja muuttujalla on ohjelmassa laajuus, josta voimme käyttää kyseistä muuttujaa. Esimerkiksi funktiomuuttujaa voidaan käyttää vain funktion sisällä. Tarkastellaanpa seuraavaa kuvaa:
Esimerkki -
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()
Lähtö:
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-nimiavaruussanakirjat
Edellisessä opetusohjelmassa puhuimme siitä, kuinka nimiavaruudet ovat kuin sanakirjoja, joissa avaimet edustavat objektien nimiä ja arvot edustavat todellisia objekteja. Python käyttää sanakirjoja sekä globaaleja että paikallisia nimiavaruuksia. Pääsy globaaleihin ja paikallisiin nimiavaruussanakirjoihin on mahdollista Pythonin globals()- ja locals()-menetelmien avulla.
Globals()-menetelmä
Globals()-metodi palauttaa viittauksen nykyiseen globaaliin nimiavaruussanakirjaan. Voimme käyttää sitä globaalin nimiavaruuden objekteihin pääsyyn. Katsotaanpa alla olevaa esimerkkiä.
Esimerkki -
>>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
Kuten näemme, siinä on monia sisäänrakennettuja merkintöjä globaalit() menetelmä. Se voi vaihdella käyttöjärjestelmäsi ja Python-versiosi mukaan. Nyt määritellään globaali muuttuja ja tarkkaillaan eroja.
java if -lause
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20}
Arvon a = 20 määrittämisen jälkeen globaaliin nimiavaruussanakirjaan on määritetty uusi globaali muuttuja. Voimme käyttää arvoja samalla tavalla kuin sanakirjoissa. Katsotaanpa alla olevaa esimerkkiä.
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20
Voimme muokata sanakirjan arvoa globals()-funktiolla.
>>> globals()['a'] = 100 >>> a 100
Nyt a:n uusi arvo ilmestyy maailmanlaajuisiin sanakirjoihin.
Paikalliset()-funktio
Python tarjoaa myös locals()-menetelmän, joka on samanlainen kuin globals(), mutta käyttää sen sijaan paikallisen nimiavaruuden objekteja. Katsotaanpa seuraava esimerkki.
Esimerkki -
>>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'}
Kun kutsumme func(10, 20), locals() palauttaa sanakirjan, joka edustaa funktion paikallista nimiavaruutta. Toimintoalueella määritimme paikallisen muuttujan str1; paikallinen nimiavaruus sisälsi funktion argumentit, koska ne ovat paikallisia func(:lle).
Siitä huolimatta, kun kutsumme local people() -ominaisuutta, se toimii samalla tavalla kuin globals()-ominaisuus. Globals()-funktio ja locals()-funktio eroavat hieman toisistaan. Globals()-funktio ei ainoastaan määrittele lisämuuttujia, vaan myös tallentaa palautusarvon. Sanakirja sisältää uudet muuttujat ja niiden arvot. Katso alla olevaa esimerkkiä.
Esimerkki -
>>> 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'}
Tässä glob_var on viittaus globaaliin nimiavaruussanakirjaan. Uudet toimeksiantolausekkeet x ja ja ilmestyi glob_var sanakirja.
Muuttujien muuttaminen soveltamisalan ulkopuolelle
Kutsuvassa ympäristössä funktio voi muuttaa argumenttia välittämällä eri arvon, mutta joskus se ei voi muuttaa arvoa.
rekisterin siirtologiikka
Muuttumatonta argumenttia ei voi muokata funktiolla.
Muuttuva argumentti voidaan muuttaa paikallaan, mutta sitä ei voida määritellä kokonaan uudelleen.
Ymmärretään seuraava skenaario.
Esimerkki -
x = 20 def func(): x = 40 print(x) func() print(x)
Lähtö:
40 20
Määrittelemme globaalin muuttujan x = 20 ja myös samannimiseen funktioon. Kun func() suoritetaan, se luo uuden paikallisen muuttujan viittauksen kokonaislukuobjektiin, jonka arvo on 40. func() body, määrityskäsky ei vaikuta globaaliin objektiin.
Funktio voi kuitenkin muokata muuttuvaa tyyppiä olevaa objektia paikallisen laajuutensa ulkopuolella. Ymmärretään alla oleva esimerkki.
tring to int
Esimerkki -
my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func())
Oma_lista on luettelo ja se on muuttuva tyyppi. Func() voi muuttua my_list sisällä, vaikka se on paikallisen laajuuden ulkopuolella. Mutta jos yritämme määrittää my_list-luettelon uudelleen, se luo uuden paikallisen objektin eikä muuta globaalia omaa_luetteloa. Katsotaanpa alla olevaa esimerkkiä.
Esimerkki -
my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func())
Lähtö:
['A', 'B', 'C', 'D', 'E']
Johtopäätös
Huolehdimme nimiavaruudesta, sen hyödyntämisestä ja muuttujan asteesta. Lyhyellä Python-ohjelmalla voidaan luoda lukuisia erillisiä objekteja. Tämä luku voi ylittää tuhat monimutkaisessa Python-ohjelmassa. Python-nimiavaruuden ansiosta tulkin on helpompi muistaa näiden objektien nimet.