Пространство от имена на Python и обхват на променлива

В този урок ще научите за пространството от имена, картографиране от имена към обекти и обхват на променлива.

Какво е Име в Python?

Ако някога сте чели „Дзенът на Python“ (напишете import thisв интерпретатора на Python), последният ред гласи, Пространствата от имена са една чудесна идея - нека направим повече от тях! И така, какви са тези мистериозни пространства от имена? Нека първо разгледаме какво е името.

Име (наричано още идентификатор) е просто име, дадено на обекти. Всичко в Python е обект. Името е начин за достъп до основния обект.

Например, когато изпълняваме задачата a = 2, 2обектът се съхранява в паметта и а е името, с което го свързваме. Можем да получим адреса (в RAM) на даден обект чрез вградената функция 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+1, се създава нов обект 3и сега а се свързва с този обект.

Имайте предвид, че 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.

Интересни статии...