Przestrzeń nazw Pythona i zakres zmiennej

W tym samouczku nauczysz się przestrzeni nazw, mapowania nazw na obiekty i zakresu zmiennej.

Co to jest nazwa w Pythonie?

Jeśli kiedykolwiek przeczytałeś „Zen Pythona” (wpisz import thisinterpreter Pythona), ostatnie stany linii, przestrzenie nazw to jeden świetny pomysł - zróbmy więcej! Więc czym są te tajemnicze przestrzenie nazw? Przyjrzyjmy się najpierw, jakie to imię.

Nazwa (zwana także identyfikatorem) to po prostu nazwa nadana obiektom. Wszystko w Pythonie jest obiektem. Nazwa to sposób na uzyskanie dostępu do podstawowego obiektu.

Na przykład, kiedy wykonujemy przypisanie a = 2, 2jest to obiekt przechowywany w pamięci, a a jest nazwą, z którą go kojarzymy. Możemy uzyskać adres (w pamięci RAM) jakiegoś obiektu poprzez wbudowaną funkcję id(). Spójrzmy, jak go używać.

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

Wynik

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

Tutaj oba odnoszą się do tego samego obiektu 2, więc mają to samo id(). Zróbmy trochę ciekawiej.

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

Wynik

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

Co się dzieje w powyższej kolejności kroków? Użyjmy diagramu, aby to wyjaśnić:

Diagram pamięci zmiennych w Pythonie

Początkowo 2tworzony jest obiekt i kojarzona jest z nim nazwa a, kiedy to robimy a = a+1, 3tworzony jest nowy obiekt i teraz kojarzony jest z tym obiektem.

Zauważ, że id(a)i id(3)mają te same wartości.

Ponadto, gdy b = 2jest wykonywany, nowa nazwa b zostaje skojarzona z poprzednim obiektem 2.

Jest to wydajne, ponieważ Python nie musi tworzyć nowego zduplikowanego obiektu. Ta dynamiczna natura wiązania nazw sprawia, że ​​Python jest potężny; nazwa może odnosić się do dowolnego typu obiektu.

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

Wszystkie te są prawidłowe i będzie odnosić się do trzech różnych typów obiektów w różnych instancjach. Funkcje też są obiektami, więc nazwa również może się do nich odnosić.

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

Wynik

 cześć

Ta sama nazwa może odnosić się do funkcji i możemy wywołać funkcję, używając tej nazwy.

Co to jest przestrzeń nazw w Pythonie?

Teraz, gdy już wiemy, czym są nazwy, możemy przejść do koncepcji przestrzeni nazw.

Mówiąc najprościej, przestrzeń nazw to zbiór nazw.

W Pythonie możesz wyobrazić sobie przestrzeń nazw jako odwzorowanie każdej zdefiniowanej nazwy na odpowiadające jej obiekty.

Różne przestrzenie nazw mogą współistnieć w danym czasie, ale są całkowicie odizolowane.

Przestrzeń nazw zawierająca wszystkie wbudowane nazwy jest tworzona, gdy uruchamiamy interpreter Pythona i istnieje tak długo, jak działa interpreter.

To jest powód, że wbudowanych funkcji, takich jak id(), print()itd. Są zawsze dostępne dla nas z każdej części programu. Każdy moduł tworzy własną globalną przestrzeń nazw.

Te różne przestrzenie nazw są izolowane. Dlatego te same nazwy, które mogą istnieć w różnych modułach, nie kolidują.

Moduły mogą mieć różne funkcje i klasy. Lokalna przestrzeń nazw jest tworzona, gdy wywoływana jest funkcja, która ma wszystkie zdefiniowane w niej nazwy. Podobnie jest z klasą. Poniższy diagram może pomóc w wyjaśnieniu tej koncepcji.

Diagram różnych przestrzeni nazw w Pythonie

Zakres zmiennych w Pythonie

Chociaż zdefiniowano różne unikalne przestrzenie nazw, możemy nie mieć dostępu do wszystkich z nich z każdej części programu. W grę wchodzi koncepcja zakresu.

Zakres to część programu, z której można uzyskać bezpośredni dostęp do przestrzeni nazw bez żadnego przedrostka.

W dowolnym momencie istnieją co najmniej trzy zagnieżdżone lunety.

  1. Zakres aktualnej funkcji, która ma nazwy lokalne
  2. Zakres modułu, który ma nazwy globalne
  3. Najbardziej zewnętrzny zakres, który ma wbudowane nazwy

Kiedy odwołanie jest dokonywane wewnątrz funkcji, nazwa jest przeszukiwana w lokalnej przestrzeni nazw, następnie w globalnej przestrzeni nazw, a na końcu we wbudowanej przestrzeni nazw.

Jeśli w innej funkcji znajduje się funkcja, nowy zakres jest zagnieżdżony w zasięgu lokalnym.

Przykład zakresu i przestrzeni nazw w Pythonie

 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

W tym programie trzy różne zmienne a są zdefiniowane w oddzielnych przestrzeniach nazw i odpowiednio do nich dostępne. W poniższym programie

 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)

Dane wyjściowe programu to.

 a = 30 a = 30 a = 30 

Tutaj wszystkie odniesienia i przypisania odnoszą się do globalnego a ze względu na użycie słowa kluczowego global.

Interesujące artykuły...