Jmenný prostor Pythonu a rozsah proměnné

V tomto kurzu se dozvíte o oboru názvů, mapování z názvů na objekty a rozsahu proměnné.

Co je to jméno v Pythonu?

Pokud jste si někdy přečetli „The Zen of Python“ (zadejte import thisdo interpretu Pythonu), uvádí se v posledním řádku, že jmenné prostory jsou skvělý nápad - pojďme toho udělat víc! Takže jaké jsou tyto tajemné jmenné prostory? Nejprve se podívejme, jaké je jméno.

Název (také nazývaný identifikátor) je jednoduše název daný objektům. Všechno v Pythonu je objekt. Název je způsob přístupu k podkladovému objektu.

Když například provádíme přiřazení a = 2, 2je objekt uložený v paměti a a je název, s nímž jej spojujeme. Můžeme získat adresu (v RAM) nějakého objektu pomocí vestavěné funkce id(). Pojďme se podívat, jak to použít.

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

Výstup

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

Zde oba odkazují na stejný objekt 2, takže mají stejný id(). Udělejme věci trochu zajímavějšími.

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

Výstup

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

Co se děje ve výše uvedené posloupnosti kroků? Vysvětlíme to pomocí diagramu:

Paměťový diagram proměnných v Pythonu

Zpočátku 2je vytvořen objekt a je k němu přidruženo jméno a, když to uděláme a = a+1, 3je vytvořen nový objekt a nyní je k tomuto objektu přidruženo a.

Všimněte si, že id(a)a id(3)mají stejné hodnoty.

Kromě toho, když b = 2se provede, nový název b se přidruží k předchozímu objektu 2.

To je efektivní, protože Python nemusí vytvářet nový duplicitní objekt. Tato dynamická povaha vázání jmen činí Python silným; název by mohl odkazovat na jakýkoli typ objektu.

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

Všechny tyto jsou platné a bude odkazovat na tři různé typy objektů v různých případech. Funkce jsou také objekty, takže na ně může odkazovat i název.

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

Výstup

 Ahoj

Stejný název a může odkazovat na funkci a funkci můžeme volat pomocí tohoto názvu.

Co je to jmenný prostor v Pythonu?

Nyní, když chápeme, co jsou to jména, můžeme přejít k konceptu jmenných prostorů.

Jednoduše řečeno, jmenný prostor je sbírka jmen.

V Pythonu si můžete představit jmenný prostor jako mapování každého jména, které jste definovali na odpovídající objekty.

V daném čase mohou koexistovat různé jmenné prostory, ale jsou zcela izolované.

Obor názvů obsahující všechny předdefinované názvy se vytvoří, když spustíme překladač Pythonu, a existuje, dokud běží tlumočník.

To je důvod, že vestavěné funkce, jako je id(), print()atd. Jsou vždy máme k dispozici z kterékoliv části programu. Každý modul vytváří svůj vlastní globální jmenný prostor.

Tyto různé jmenné prostory jsou izolované. Stejný název, který může existovat v různých modulech, se tedy nesrazí.

Moduly mohou mít různé funkce a třídy. Místní jmenný prostor je vytvořen, když je volána funkce, která má v sobě definované všechny názvy. Podobný je případ třídy. Následující diagram může pomoci objasnit tento koncept.

Schéma různých jmenných prostorů v Pythonu

Variabilní rozsah Pythonu

I když jsou definovány různé jedinečné jmenné prostory, nemusíme mít přístup ke všem z každé části programu. Do hry vstupuje koncept rozsahu.

Rozsah je část programu, ze které lze přímo do jmenného prostoru přistupovat bez jakékoli předpony.

V daném okamžiku existují nejméně tři vnořené obory.

  1. Rozsah aktuální funkce, která má místní názvy
  2. Rozsah modulu, který má globální názvy
  3. Nejvzdálenější obor, který má zabudovaná jména

Když se vytvoří odkaz uvnitř funkce, název se prohledá v místním oboru názvů, poté v globálním oboru názvů a nakonec ve vestavěném oboru názvů.

Pokud je funkce uvnitř jiné funkce, je nový obor vnořen do místního rozsahu.

Příklad oboru a jmenného prostoru v Pythonu

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

Zde je proměnná a v globálním prostoru jmen. Proměnná b je v místním jmenném prostoru outer_function()ac je ve vnořeném místním jmenném prostoru inner_function().

Když jsme v inner_function(), c je pro nás lokální, b je nelokální a a je globální. Můžeme číst i přiřadit nové hodnoty c, ale můžeme číst pouze b a a z inner_function().

Pokud se pokusíme přiřadit jako hodnotu b, vytvoří se v místním oboru názvů nová proměnná b, která se liší od nelokálního b. Totéž se stane, když přiřadíme hodnotu a.

Pokud však deklarujeme a jako globální, všechny reference a přiřazení přejdou do globálního a. Podobně, pokud chceme znovu svázat proměnnou b, musí být deklarována jako nelokální. Následující příklad to dále objasní.

 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)

Jak vidíte, výstup tohoto programu je

 a = 30 a = 20 a = 10

V tomto programu jsou definovány tři různé proměnné a v samostatných jmenných prostorech a je k nim odpovídajícím způsobem přistupováno. V následujícím programu

 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)

Výstupem programu je.

 a = 30 a = 30 a = 30 

Zde jsou všechny odkazy a přiřazení ke globálnímu a kvůli použití klíčového slova global.

Zajímavé články...