logo

Именски простор у Питхон-у

У овом водичу ћемо научити о простору имена у Питхон-у, структури која се користи за организовање симболичких имена додељених објектима у Питхон програму, зашто је простор имена важан и како их можемо користити у нашем Питхон програму. Хајде да укратко упознамо именски простор.

онцлицк јавасцрипт

Шта је именски простор?

У Питхон-у, начин да се сваком објекту да јединствено име је кроз именски простор. Променљиве и методе су примери објеката у Питхон-у. Другим речима, то је скуп познатих симболичких имена и детаља о ствари на коју се свако име односи. Име се може сматрати кључем у речнику, а објекти су вредности у именском простору. Требало би да то схватимо помоћу оригиналног модела - Именски простор личи на презиме. Ако постоји више 'Петер' имена у класи, можда ће бити тешко лоцирати 'Петер' име; међутим, када изричито тражимо 'Петер Варнер' или 'Петер Цумминс', у разреду, можда није уобичајено да више ученика има исто име и презиме.

Питхон интерпретер може боље разумети тачан метод или променљиву у коду захваљујући именском простору. Као резултат, његово име садржи додатне информације, укључујући простор (везано за опсег) и Име, које означава јединствени идентификатор.

У Питхон-у постоје четири типа именских простора који су дати у наставку.

  • Уграђени
  • Глобал
  • Енцлосинг
  • Локални

Пошто ови простори имена имају животни век, Питхон интерпретер креира просторе имена по потреби и брише их када више нису потребни.

Хајде да разумемо различите типове именског простора у Питхон-у.

Уграђени простор имена

Као што му име говори, садржи унапред дефинисана имена свих Питхон-ових уграђених објеката који су већ доступни у Питхон-у. Хајде да наведемо ова имена следећом командом.

Отворите Питхон терминал и откуцајте следећу команду.

команда -

 dir(__builtins__) 

Излаз:

немогућа мисија сви филмови
 ['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'] 

Уграђени простор имена креира Питхон интерпретер када се покрене. Они се прекидају када се Питхон интерпретер заврши.

Глобални простор имена

Глобални именски простор се састоји од било ког имена у Питхон-у на било ком нивоу главног програма. Настаје када се главно тело изврши и остаје у постојању све док интерпретатор не заврши.

Питхон интерпретер креира глобални простор имена за било који модул који наш Питхон учитава наредбом импорт. Да бисте добили више информација, посетите наш Питхон модул.

Локални и окружујући простори имена

Функција користи локалне просторе имена; Када се функција покрене, Питхон интерпретер креира нови простор имена. Локални простори имена настављају да постоје након што функција заврши са радом. Способност се такође може састојати од друге способности. Као што је приказано у наставку, можемо дефинисати једну функцију унутар друге.

Пример -

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

У горњем моделу, способност г() се карактерише унутар колекције ф(). Позвали смо г() функцију унутар ф() и главну ф() функцију. Погледајмо како функционише горња функција:

  • Питхон креира нови простор имена за ф() када га позовемо.
  • Слично, ф() позива г(), г() добија свој другачији именски простор.
  • Локални именски простор г() је креиран за окружујући простор имена, ф().

Сваки од ових именских простора се прекида када се функција заврши.

Опсег објекта/варијабле

Термин 'опсег' одређује ком региону кодирања одређеног Питхон објекта може да се приступи. Сваки објекат и променљива имају опсег у програму из којег можемо приступити тој променљивој. На пример, променљивој функције може се приступити само унутар функције. Хајде да погледамо следећу илустрацију:

Пример -

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

Излаз:

 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 

Питхон именски речници

У претходном туторијалу смо говорили о томе како су простори имена попут речника, са кључевима који представљају имена објеката и вредности које представљају стварне објекте. Као речници, Питхон користи и глобалне и локалне просторе имена. Приступ глобалним и локалним речницима простора имена омогућен је помоћу Питхон-ових глобалс() и лоцалс() метода.

ако по Радјарду Киплингу сажетак

Метод глобалс().

Метод глобалс() враћа референцу на тренутни речник глобалног простора имена. Можемо га користити за приступ објектима у глобалном именском простору. Погледајмо пример у наставку.

Пример -

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

Као што видимо, постоји много уграђених уноса глобалс() методом. Може се разликовати у зависности од вашег оперативног система и верзије Питхон-а. Хајде сада да дефинишемо глобалну променљиву и посматрамо разлике.

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

Након доделе а = 20, нова глобална променљива додељена је глобалном речнику простора имена. Можемо приступити вредностима онако како приступамо у речницима. Погледајмо пример у наставку.

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

Можемо да изменимо вредност речника помоћу функције глобалс().

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

Сада ће се нова вредност а појавити у глобалним речницима.

Функција лоцалс().

Питхон такође обезбеђује лоцалс() метод сличан глобалс(), али уместо тога приступа објектима у локалном простору имена. Погледајмо следећи пример.

Пример -

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

Када позовемо фунц(10, 20), лоцалс() враћа речник који представља локални именски простор функције. У опсегу функције дефинисали смо локалну променљиву стр1; локални именски простор је укључивао аргументе функције пошто су они локални за фунц().

Без обзира на то, када зовемо лоцал пеопле() способност, она делује еквивалентно глобалс() способности. Функција глобалс() и функција лоцалс() се мало разликују. Функција глобалс() не само да дефинише додатне променљиве већ и чува повратну вредност. Речник ће садржати нове варијабле и њихове вредности. Погледајте пример у наставку.

Пример -

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

Ево глоб_вар је референца на глобални речник именског простора. Нове изјаве о задатку Икс и и појавио у глоб_вар речник.

Промена променљивих ван опсега

У окружењу које позива, функција може да промени аргумент преношењем друге вредности, али понекад не може да промени вредност.

репл у јава

Непроменљиви аргумент се не може модификовати помоћу функције.

Променљиви аргумент се може променити на месту, али се не може потпуно редефинисати.

Хајде да разумемо следећи сценарио.

Пример -

хакерска обрада
 x = 20 def func(): x = 40 print(x) func() print(x) 

Излаз:

 40 20 

Дефинишемо глобалну променљиву к = 20 и такође у функцији са истим именом. Када се фунц() изврши, креира нову референцу локалне променљиве на целобројни објекат чија је вредност 40. Унутар фунц() тело, израз доделе неће утицати на глобални објекат.

Међутим, функција може да модификује објекат променљивог типа ван свог локалног опсега. Хајде да разумемо следећи пример.

Пример -

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

Ми_лист је листа и променљивог је типа. Фунц() може да се мења унутар ми_лист иако је изван локалног опсега. Али, ако покушамо да поново доделимо ми_лист, то ће креирати нови локални објекат и неће модификовати глобалну ми_лист. Погледајмо пример у наставку.

Пример -

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

Излаз:

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

Закључак

Водимо рачуна о именском простору, како га можемо искористити и степену променљиве. Бројни различити објекти се могу креирати кратким Питхон програмом. Овај број може премашити хиљаду у компликованом Питхон програму. Питхон именски простор олакшава тумачу да запамти имена ових објеката.