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 this
do 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
, 2
je 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:

Zpočátku 2
je vytvořen objekt a je k němu přidruženo jméno a, když to uděláme a = a+1
, 3
je 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 = 2
se 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.

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.
- Rozsah aktuální funkce, která má místní názvy
- Rozsah modulu, který má globální názvy
- 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
.