logo

Vardų erdvė Python

Šioje pamokoje sužinosime apie Python vardų erdvę, struktūrą, naudojamą Python programoje objektams priskirtiems simboliniams pavadinimams tvarkyti, kodėl vardų erdvė yra svarbi ir kaip galime juos naudoti savo Python programoje. Trumpai supažindinkime su vardų erdve.

Kas yra vardų erdvė?

„Python“ kiekvienam objektui unikalų pavadinimą galima suteikti naudojant vardų erdvę. Kintamieji ir metodai yra Python objektų pavyzdžiai. Kitaip tariant, tai yra žinomų simbolinių pavadinimų ir detalių apie daiktą, į kurį kiekvienas vardas nurodo, rinkinys. Vardas gali būti laikomas raktu žodyne, o objektai yra vardų erdvės reikšmės. Turėtume tai išsiaiškinti naudodami tikrą modelį – vardų erdvė primena pavardę. Jei klasėje yra keli „Petro“ vardai, gali būti sunku surasti „Petro“ vardą; tačiau kai konkrečiai prašome „Peter Warner“ arba „Peter Cummins“, klasėje gali būti neįprasta, kad keli mokiniai turi tą patį vardą ir pavardę.

„Python“ vertėjas gali geriau suprasti tikslų kodo metodą arba kintamąjį dėl vardų erdvės. Todėl jo pavadinime yra papildomos informacijos, įskaitant tarpą (susijusią su apimtimi) ir pavadinimą, nurodantį unikalų identifikatorių.

Python yra keturių tipų vardų erdvės, kurios pateikiamos toliau.

  • Įmontuota
  • Pasaulinis
  • Aptvaraus
  • Vietinis

Kadangi šios vardų erdvės galioja įvairiai, Python interpretatorius sukuria vardų erdves, kai reikia, ir ištrina jas, kai jos nebereikalingos.

f filmai

Supraskime įvairius Python vardų srities tipus.

Integruota vardų erdvė

Kaip rodo jo pavadinimas, jame yra iš anksto nustatyti visų Python integruotų objektų pavadinimai, jau prieinami Python. Išvardykime šiuos pavadinimus naudodami šią komandą.

Atidarykite Python terminalą ir įveskite šią komandą.

Komanda -

 dir(__builtins__) 

Išvestis:

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

Integruotą vardų erdvę sukuria Python interpretatorius, kai jis paleidžiamas. Jie nutraukiami, kai baigiasi Python interpretatorius.

Visuotinė vardų erdvė

Visuotinę vardų erdvę sudaro bet kokie „Python“ pavadinimai bet kuriame pagrindinės programos lygyje. Jis sukuriamas, kai vykdo pagrindinę dalį, ir išlieka tol, kol baigiasi vertėjas.

„Python“ interpretatorius sukuria visuotinę vardų erdvę bet kuriam moduliui, kurį „Python“ įkelia kartu su importavimo sakiniu. Norėdami gauti daugiau informacijos, apsilankykite mūsų Python modulyje.

Vietinė ir uždaroji vardų erdvės

Vietines vardų sritis naudoja funkcija; Kai funkcija vykdoma, Python interpretatorius sukuria naują vardų erdvę. Vietinės vardų erdvės išlieka ir pasibaigus funkcijai. Galimybė taip pat gali apimti kitą galimybę. Kaip parodyta toliau, galime apibrėžti vieną funkciją kitoje.

Pavyzdys -

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

Aukščiau pateiktame modelyje galimybė g() apibūdinama f() rinkinyje. Mes pavadinome funkciją g () f () ir pagrindinę f () funkciją. Pažiūrėkime, kaip veikia aukščiau pateikta funkcija:

  • Python sukuria naują f() vardų erdvę, kai ją iškviečiame.
  • Taip pat f() skambučiai g(), g() gauna savo skirtingą vardų erdvę.
  • Vietinė vardų erdvė g() buvo sukurta uždarai vardų erdvei f().

Kiekviena iš šių vardų sričių baigiasi, kai funkcija nutraukiama.

Objekto / kintamojo apimtis

Terminas „apimtis“ nurodo, kurią konkretaus Python objekto kodavimo sritį galima pasiekti. Kiekvienas objektas ir kintamasis programoje turi apimtį, iš kurios galime pasiekti tą kintamąjį. Pavyzdžiui, funkcijos kintamąjį galima pasiekti tik funkcijoje. Panagrinėkime šią iliustraciją:

Pavyzdys -

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

Išvestis:

 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 vardų erdvės žodynai

Ankstesnėje pamokoje kalbėjome apie tai, kaip vardų erdvės yra kaip žodynai, kurių raktai reiškia objektų pavadinimus, o reikšmės – tikruosius objektus. Kaip žodynai, Python naudoja tiek pasaulines, tiek vietines vardų sritis. Prieiga prie globalių ir vietinių vardų erdvės žodynų yra įmanoma naudojant Python globals() ir locals() metodus.

Globals() metodas

Metodas globals() grąžina nuorodą į dabartinį pasaulinės vardų erdvės žodyną. Jį galime naudoti norėdami pasiekti objektus globalioje vardų erdvėje. Pažiūrėkime žemiau pateiktą pavyzdį.

Prisijunkite prie mysql atnaujinimo

Pavyzdys -

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

Kaip matome, yra daug integruotų įrašų globaliai () metodas. Jis gali skirtis priklausomai nuo jūsų operacinės sistemos ir Python versijos. Dabar apibrėžkime visuotinį kintamąjį ir stebėkime skirtumus.

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

Priskyrus a = 20, pasauliniam vardų erdvės žodynui priskiriamas naujas pasaulinis kintamasis. Vertes galime pasiekti taip, kaip pasiekiame žodynuose. Pažiūrėkime žemiau pateiktą pavyzdį.

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

Žodyno reikšmę galime keisti naudodami globals() funkciją.

java eilučių sujungimas
 >>> globals()['a'] = 100 >>> a 100 

Dabar pasauliniuose žodynuose atsirado nauja a reikšmė.

Vietinių gyventojų () funkcija

Python taip pat teikia locals() metodą, panašų į globals(), bet vietoj to pasiekia objektus vietinėje vardų erdvėje. Pažiūrėkime toliau pateiktą pavyzdį.

Pavyzdys -

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

Kai iškviečiame func(10, 20), locals() grąžina žodyną, vaizduojantį funkcijos vietinę vardų erdvę. Funkcijos srityje apibrėžėme vietinį kintamąjį str1; vietinėje vardų erdvėje buvo funkcijos argumentai, nes jie yra lokalūs func().

Nepaisant to, kai vadiname vietinių žmonių () gebėjimu, jis veikia lygiavertis globals () gebėjimui. Funkcijos globals() ir locals() funkcijos šiek tiek skiriasi. Funkcija globals() ne tik apibrėžia papildomus kintamuosius, bet ir išsaugo grąžinamąją reikšmę. Žodyne bus pateikti nauji kintamieji ir jų reikšmės. Pažvelkite į toliau pateiktą pavyzdį.

Pavyzdys -

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

Čia glob_var yra nuoroda į visuotinį vardų erdvės žodyną. Nauji priskyrimo pareiškimai x ir ir pasirodė glob_var žodynas.

Kintamųjų keitimas nepatenka į taikymo sritį

Iškvietimo aplinkoje funkcija gali pakeisti argumentą perduodama kitą reikšmę, tačiau kartais ji negali pakeisti reikšmės.

Nekeičiamas argumentas negali būti pakeistas funkcija.

Keičiamas argumentas gali būti pakeistas vietoje, bet negali būti visiškai iš naujo apibrėžtas.

Supraskime tokį scenarijų.

Pavyzdys -

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

Išvestis:

 40 20 

Mes apibrėžiame visuotinį kintamąjį x = 20 ir taip pat funkciją tuo pačiu pavadinimu. Kai func() vykdomas, jis sukuria naują vietinio kintamojo nuorodą į sveikojo skaičiaus objektą, kurio reikšmė yra 40. func() body, priskyrimo sakinys neturės įtakos visuotiniam objektui.

Tačiau funkcija gali modifikuoti kintamo tipo objektą už savo vietos ribų. Supraskime žemiau pateiktą pavyzdį.

kaip java paversti eilutę į int

Pavyzdys -

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

Mano_sąrašas yra sąrašas, kurio tipas yra keičiamas. Func() gali keistis my_list viduje, net jei jis yra už vietinės apimties. Bet jei bandysime iš naujo priskirti mano_sąrašą, jis sukurs naują vietinį objektą ir nekeis visuotinio mano_sąrašo. Pažiūrėkime žemiau pateiktą pavyzdį.

Pavyzdys -

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

Išvestis:

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

Išvada

Mes rūpinamės vardų erdve, kaip galime ją panaudoti ir kintamojo laipsnį. Su trumpa Python programa galima sukurti daugybę skirtingų objektų. Sudėtingoje Python programoje šis skaičius gali viršyti tūkstantį. Python vardų erdvė leidžia interpretatoriui lengviau atsiminti šių objektų pavadinimus.