logo

Простір імен у Python

У цьому посібнику ми дізнаємося про простір імен у Python, структуру, яка використовується для організації символічних імен, призначених об’єктам у програмі Python, чому простір імен важливий і як ми можемо використовувати їх у нашій програмі Python. Давайте коротко ознайомимося з простором імен.

Що таке простір імен?

У Python кожному об’єкту можна надати унікальне ім’я за допомогою простору імен. Змінні та методи є прикладами об’єктів у Python. Іншими словами, це набір відомих символічних назв і подробиць про річ, до якої відноситься кожна назва. Ім’я можна розглядати як ключ у словнику, а об’єкти – це значення в просторі імен. Ми повинні з’ясувати це за допомогою справжньої моделі – простір імен нагадує прізвище. Якщо в класі є кілька імен «Петро», може бути важко знайти ім’я «Петро»; однак, коли ми спеціально запитуємо «Пітер Уорнер» або «Пітер Каммінс», у класі може бути незвичним, що кілька студентів мають однакові ім’я та прізвище.

Інтерпретатор Python може краще зрозуміти точний метод або змінну в коді завдяки простору імен. Як наслідок, його ім’я містить додаткову інформацію, зокрема Пробіл (пов’язаний із областю дії) та Ім’я, яке позначає унікальний ідентифікатор.

У Python існує чотири типи просторів імен, які наведено нижче.

  • Вбудований
  • Глобальний
  • огородження
  • Місцевий

Оскільки ці різні простори імен мають час життя, інтерпретатор Python створює простори імен за необхідності та видаляє їх, коли вони більше не потрібні.

Давайте розберемося з різними типами простору імен у Python.

Вбудований простір імен

Як випливає з назви, він містить попередньо визначені імена всіх вбудованих об’єктів Python, які вже доступні в Python. Давайте перерахуємо ці імена за допомогою такої команди.

Відкрийте термінал Python і введіть таку команду.

Команда -

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

Вбудований простір імен створюється інтерпретатором Python під час його запуску. Вони припиняються, коли завершується робота інтерпретатора Python.

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

Глобальний простір імен складається з будь-яких імен у Python на будь-якому рівні основної програми. Він створюється, коли виконується основне тіло, і продовжує існувати до завершення роботи інтерпретатора.

Інтерпретатор Python створює глобальний простір імен для будь-якого модуля, який наш Python завантажує оператором import. Щоб отримати більше інформації, відвідайте наш модуль Python.

Локальний і охоплюючий простори імен

Локальні простори імен використовуються функцією; Коли функція виконується, інтерпретатор Python створює новий простір імен. Локальні простори імен продовжують існувати після завершення роботи функції. Можливість також може складатися з іншої можливості. Як показано нижче, ми можемо визначити одну функцію в іншій.

байтів python у рядок

приклад -

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

У наведеній вище моделі можливість g() характеризується всередині колекції f(). Ми викликали функцію g() у межах f() і основну функцію f(). Давайте розглянемо, як працює наведена вище функція:

  • Python створює новий простір імен для f(), коли ми його викликаємо.
  • Подібним чином f() викликає g(), g() отримує власний інший простір імен.
  • Локальний простір імен g() було створено для охоплюючого простору імен f().

Кожне з цих просторів імен завершується, коли функція завершується.

Область дії об’єкта/змінної

Термін «область» визначає, до якої області кодування певного об’єкта Python можна отримати доступ. Кожен об’єкт і змінна мають область у програмі, з якої ми можемо отримати доступ до цієї змінної. Наприклад, до змінної функції можна отримати доступ лише в межах функції. Давайте розглянемо наступну ілюстрацію:

приклад -

 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 

Словники простору імен Python

У попередньому посібнику ми говорили про те, як простори імен схожі на словники, де ключі представляють імена об’єктів, а значення — фактичні об’єкти. Як словники Python використовує як глобальні, так і локальні простори імен. Доступ до глобальних і локальних словників простору імен можливий завдяки методам Python globals() і locals().

Метод globals().

Метод globals() повертає посилання на поточний глобальний словник простору імен. Ми можемо використовувати його для доступу до об’єктів у глобальному просторі імен. Давайте розглянемо наведений нижче приклад.

приклад -

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

Як ми бачимо, тут є багато вбудованих записів глобальні () метод. Це може відрізнятися залежно від вашої операційної системи та версії Python. Тепер давайте визначимо глобальну змінну та поспостерігаємо за відмінностями.

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

Після призначення a = 20 нова глобальна змінна призначається глобальному словнику простору імен. Ми можемо отримати доступ до значень у словниках. Давайте розглянемо наведений нижче приклад.

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

Ми можемо змінити значення словника за допомогою функції globals().

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

Тепер нове значення a з'явиться в глобальних словниках.

Функція locals().

Python також надає метод locals(), подібний до globals(), але натомість отримує доступ до об’єктів у локальному просторі імен. Розглянемо наступний приклад.

java випадкова математика випадкова

приклад -

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

Коли ми викликаємо func(10, 20), locals() повертає словник, що представляє локальний простір імен функції. В області видимості функції ми визначили локальну змінну str1; локальний простір імен включав аргументи функції, оскільки вони локальні для func().

Незважаючи на це, коли ми називаємо можливість local people(), вона діє еквівалентно можливості globals(). Функції globals() і locals() дещо відрізняються. Функція globals() не тільки визначає додаткові змінні, але й зберігає значення, що повертається. Словник міститиме нові змінні та їхні значення. Подивіться на приклад нижче.

приклад -

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

Ось glob_var є посиланням на глобальний словник простору імен. Нові заяви про призначення х і і з'явився в glob_var словник.

Зміна змінних поза областю

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

Незмінний аргумент не може бути змінений функцією.

Змінний аргумент можна змінити на місці, але він не може бути повністю перевизначений.

Давайте розберемося в наступному сценарії.

приклад -

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

Вихід:

 40 20 

Ми визначаємо глобальну змінну x = 20, а також функцію з такою ж назвою. Коли функція func() виконується, вона створює нове посилання на локальну змінну на цілочисельний об’єкт, значення якого дорівнює 40. Всередині функція() тіло, оператор присвоєння не вплине на глобальний об’єкт.

Однак функція може модифікувати об’єкт змінного типу поза його локальною областю. Давайте розберемо наведений нижче приклад.

приклад -

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

my_list є списком і має змінний тип. Функція func() може змінюватися всередині my_list, навіть якщо вона знаходиться за межами локальної області видимості. Але якщо ми спробуємо перепризначити my_list, це створить новий локальний об’єкт і не змінить глобальний my_list. Давайте розглянемо наведений нижче приклад.

приклад -

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

Вихід:

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

Висновок

Ми дбаємо про простір імен, про те, як ми можемо його використовувати, і про ступінь змінної. Численні окремі об’єкти можна створити за допомогою короткої програми Python. Це число може перевищувати одну тисячу в складній програмі Python. Простір імен Python полегшує інтерпретатору запам'ятовувати імена цих об'єктів.