Python névtér és egy változó hatóköre

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 thisbe 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, 2akkor 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:

A változók memóriadiagramja a Pythonban

Kezdetben egy objektum 2jön létre, és az a név társul hozzá, amikor ezt megtesszük a = a+1, új objektum 3jö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 = 2a 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.

A Python különböző névtereinek diagramja

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.

  1. Az aktuális helyi nevű függvény hatóköre
  2. Globális nevű modul hatóköre
  3. 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.

érdekes cikkek...