Простір імен Python та область дії змінної

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

Що таке ім'я в Python?

Якщо ви коли-небудь читали "Zen of Python" (введіть import thisінтерпретатор Python), в останньому рядку зазначено, що простори імен - це чудова ідея - давайте зробимо ще більше! То які це загадкові простори імен? Спершу розглянемо, що таке ім’я.

Ім'я (також зване ідентифікатором) - це просто ім'я, яке дається об'єктам. Усе в Python - це об’єкт. Ім'я - це спосіб отримати доступ до базового об'єкта.

Наприклад, коли ми виконуємо призначення a = 2, 2це об’єкт, що зберігається в пам’яті, а a - це ім’я, з яким ми його пов’язуємо. Ми можемо отримати адресу (в оперативній пам’яті) якогось об’єкта за допомогою вбудованої функції id(). Давайте розглянемо, як ним користуватися.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Вихідні дані

 id (2) = 9302208 id (a) = 9302208

Тут обидва посилаються на один і той же об’єкт 2, тому вони мають однакові id(). Давайте зробимо справи трохи цікавішими.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Вихідні дані

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Що відбувається у вищевказаній послідовності кроків? Давайте використаємо схему, щоб пояснити це:

Схема пам'яті змінних у Python

Спочатку створюється об’єкт 2і з ним пов’язується ім’я a, коли ми це робимо a = a+1, створюється новий об’єкт 3, і тепер a пов’язується з цим об’єктом.

Зауважте, що id(a)і id(3)мають однакові значення.

Крім того, при b = 2виконанні нове ім'я b асоціюється з попереднім об'єктом 2.

Це ефективно, оскільки Python не повинен створювати новий повторюваний об'єкт. Цей динамічний характер прив’язки імен робить Python потужним; ім'я могло посилатися на будь-який тип об'єкта.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Все це є дійсним, і a буде стосуватися трьох різних типів об'єктів у різних випадках. Функції - це теж об’єкти, тому ім’я може посилатися і на них.

 def printHello(): print("Hello") a = printHello a()

Вихідні дані

 Здравствуйте

Те саме ім'я a може посилатися на функцію, і ми можемо викликати функцію, використовуючи це ім'я.

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

Тепер, коли ми зрозуміли, що таке імена, ми можемо перейти до поняття просторів імен.

Простіше кажучи, простір імен - це набір імен.

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

Різні простори імен можуть співіснувати у певний час, але повністю ізольовані.

Простір імен, що містить усі вбудовані імена, створюється під час запуску інтерпретатора Python і існує до тих пір, поки інтерпретатор працює.

Це є причиною того, що вбудовані функції , як id(), і print()т.д. завжди доступні нам з будь-якої частини програми. Кожен модуль створює власний глобальний простір імен.

Ці різні простори імен ізольовані. Отже, однакові назви, які можуть існувати в різних модулях, не стикаються.

Модулі можуть мати різні функції та класи. Локальний простір імен створюється при виклику функції, яка має всі імена, визначені в ній. Подібний випадок і з класом. Наступна схема може допомогти пояснити це поняття.

Діаграма різних просторів імен у Python

Змінна сфера дії Python

Незважаючи на те, що визначено різні унікальні простори імен, ми не можемо отримати до них доступ з усіх частин програми. Поняття сфери дії входить у гру.

Область дії - це частина програми, звідки можна просто отримати доступ до простору імен без будь-якого префікса.

У будь-який момент вкладено принаймні три області вкладеності.

  1. Сфера поточної функції, яка має локальні імена
  2. Сфера застосування модуля, який має глобальні імена
  3. Крайній обсяг, який має вбудовані імена

Коли посилання робиться всередині функції, ім'я шукається у локальному просторі імен, потім у глобальному просторі імен і, нарешті, у вбудованому просторі імен.

Якщо в іншій функції є функція, всередині локальної області вкладено нову область.

Приклад області дії та простору імен у Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

У цій програмі три різні змінні a визначені в окремих просторах імен і доступ до них здійснюється відповідно. Перебуваючи в наступній програмі,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

Результатом роботи програми є.

 a = 30 a = 30 a = 30 

Тут усі посилання та призначення відносяться до глобального a завдяки використанню ключового слова global.

Цікаві статті...