Ebben az oktatóanyagban megismerheti a névteret, a névektől az objektumokig történő leképezést és a változó hatókörét.
Mi a név a Pythonban?
Ha valaha olvasta a "The Python zenéjét" (írja import this
be a Python tolmácsba), az utolsó sorban az áll, hogy a névterek egy döbbenetes nagyszerű ötlet - tegyünk többet ezekből! Tehát mik ezek a titokzatos névterek? Először nézzük meg, mi a név.
A név (más néven azonosító) egyszerűen az objektumoknak adott név. A Pythonban minden objektum. A név az alapul szolgáló objektum elérésének módja.
Például, amikor elvégezzük a hozzárendelést a = 2
, 2
akkor a memóriában tárolt objektum és az a név, amelyhez társítjuk. Valamelyik objektum címét (RAM-ban) megkaphatjuk a beépített funkción keresztül id()
. Nézzük meg, hogyan kell használni.
# Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
Kimenet
id (2) = 9302208 id (a) = 9302208
Itt mindkettő ugyanarra az objektumra utal 2
, tehát ugyanaz id()
. Tegyük egy kicsit érdekesebbé a dolgokat.
# 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))
Kimenet
id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208
Mi történik a fenti lépések sorrendjében? Használjunk egy diagramot ennek magyarázatára:
![](https://cdn.wiki-base.com/9138309/python_namespace_and_scope_of_a_variable.jpg.webp)
Kezdetben egy objektum 2
jön létre, és az a név társul hozzá, amikor ezt megtesszük a = a+1
, új objektum 3
jön létre, és most egy a társul ehhez az objektumhoz.
Megjegyezzük, hogy id(a)
és id(3)
ugyanazokat az értékeket.
Ezenkívül b = 2
a végrehajtáskor az új b név társul az előző objektumhoz 2
.
Ez hatékony, mivel a Pythonnak nem kell új duplikátum objektumot létrehoznia. A névkötésnek ez a dinamikus jellege erőteljesé teszi a Pythont; egy név bármilyen típusú objektumra utalhat.
>>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)
Mindezek érvényesek, és a három különböző típusú objektumra fog utalni, különböző esetekben. A függvények is objektumok, így egy név is utalhat rájuk.
def printHello(): print("Hello") a = printHello a()
Kimenet
Szia
Ugyanaz a név utalhat egy függvényre, és ezzel a névvel hívhatjuk meg a függvényt.
Mi a névtér a Pythonban?
Most, hogy megértettük a neveket, áttérhetünk a névterek fogalmára.
Leegyszerűsítve: a névtér névgyűjtemény.
A Pythonban el lehet képzelni, hogy a névtér minden megadott név leképezésének megfelelõ objektumoknak felel meg.
Különböző névterek létezhetnek együtt egy adott időpontban, de teljesen elszigeteltek.
Az összes beépített nevet tartalmazó névtér akkor jön létre, amikor elindítjuk a Python tolmácsot, és addig létezik, amíg az értelmező fut.
Ez az oka annak, hogy a beépített funkciók, mint például id()
, print()
mindig elérhetőek a program bármely részéről. Minden modul létrehozza saját globális névterét.
Ezek a különböző névterek elszigeteltek. Ezért ugyanaz a név, amely különböző modulokban létezhet, nem ütközik össze.
A modulok különféle funkciókkal és osztályokkal rendelkezhetnek. A helyi névtér akkor jön létre, amikor meghív egy függvényt, amelyben az összes név meg van határozva. Hasonló az eset az osztály esetében is. A következő ábra segíthet ennek a koncepciónak a tisztázásában.
![](https://cdn.wiki-base.com/9138309/python_namespace_and_scope_of_a_variable_2.jpg.webp)
Python változó hatókör
Bár különféle egyedi névtereket határoztak meg, előfordulhat, hogy nem tudjuk elérni mindegyiket a program minden részéből. A hatókör fogalma lép életbe.
A hatókör a programnak az a része, ahonnan a névtér közvetlenül elérhető minden előtag nélkül.
Egy adott pillanatban legalább három beágyazott hatókör létezik.
- Az aktuális helyi nevű függvény hatóköre
- Globális nevű modul hatóköre
- A legkülső hatókör, amely beépített nevekkel rendelkezik
Ha egy függvényen belül hivatkozás történik, akkor a névre a helyi névtérben, majd a globális névtérben és végül a beépített névtérben keresünk.
Ha van egy függvény egy másik függvényen belül, akkor egy új hatókör beágyazódik a helyi hatókörbe.
Példa a Python hatókörére és névterére
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Itt az a változó a globális névtérben található. A b változó a outer_function()
és a c beágyazott helyi névterében található inner_function()
.
Amikor bent vagyunk inner_function()
, c lokális számunkra, b nem lokális és egy globális. Tudunk olvasni, valamint új értékeket rendelhetünk c-hez, de csak b és a-t olvashatunk inner_function()
.
Ha megpróbálunk értékként hozzárendelni b-hez, akkor egy új b változó jön létre a helyi névtérben, amely eltér a nem lokális b-től. Ugyanez történik akkor is, amikor a-hoz értéket rendelünk.
Ha azonban az a-t globálisnak nyilvánítjuk, akkor az összes referencia és hozzárendelés a globálisra megy. Hasonlóképpen, ha újra akarjuk kapcsolni a b változót, akkor azt nem lokálisként kell deklarálni. A következő példa ezt tovább tisztázza.
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)
Amint láthatja, ennek a programnak a kimenete
a = 30 a = 20 a = 10
Ebben a programban három különféle a változót külön névtérben definiálunk, és ennek megfelelően férünk hozzá. A következő programban
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 program kimenete az.
a = 30 a = 30 a = 30
Itt minden hivatkozás és hozzárendelés a globálisra vonatkozik a kulcsszó használata miatt global
.