Pythoni nimeruum ja muutuja ulatus

Selles õpetuses saate teada nimeruumist, nimedelt objektidele kaardistamise ja muutuja ulatuse kohta.

Mis on nimi Pythonis?

Kui olete kunagi lugenud „Pythoni zenit” (sisestage import thisPythoni tõlk), siis viimasel real on kirjas, et nimeruumid on üks tore mõte - teeme neid rohkem! Mis need salapärased nimeruumid siis on? Vaatame kõigepealt, mis nimi on.

Nimi (nimetatakse ka identifikaatoriks) on lihtsalt objektidele antud nimi. Kõik Pythonis on objekt. Nimi on viis juurdepääsu alusobjektile.

Näiteks kui me määrame ülesande a = 2, 2on see mällu salvestatud objekt ja nimi on nimi, millega me selle seostame. Mõne objekti aadressi (RAM-is) saame sisseehitatud funktsiooni kaudu id(). Vaatame, kuidas seda kasutada.

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

Väljund

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

Siin viitavad mõlemad samale objektile 2, nii et neil on sama id(). Teeme asjad veidi huvitavamaks.

 # 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äljund

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

Mis toimub ülaltoodud sammude järjestuses? Kasutame selle selgitamiseks skeemi:

Muutujate mäludiagramm Pythonis

Esialgu luuakse objekt 2ja sellega seostatakse nimi a, kui me seda teeme a = a+1, luuakse uus objekt 3ja nüüd seostatakse selle objektiga a.

Pange tähele, et id(a)ja id(3)on samad väärtused.

Peale b = 2selle seostatakse uus nimi b käivitamisel eelmise objektiga 2.

See on tõhus, kuna Python ei pea uut duplikaatobjekti looma. See nimede sidumise dünaamiline olemus muudab Pythoni võimsaks; nimi võib viidata mis tahes tüüpi objektidele.

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

Kõik need on kehtivad ja a viitab erinevatel juhtudel kolme erinevat tüüpi objektidele. Ka funktsioonid on objektid, nii et ka nimi võib neile viidata.

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

Väljund

 Tere

Sama nimi a võib viidata funktsioonile ja funktsiooni saame selle nime abil kutsuda.

Mis on Pythoni nimeruum?

Nüüd, kui oleme aru saanud, mis nimed on, võime liikuda nimeruumide kontseptsiooni juurde.

Lihtsamalt öeldes on nimeruum nimede kogu.

Pythonis saate nimeruumi ette kujutada iga teie määratletud nime vastavusse viimisega vastavate objektidega.

Erinevad nimeruumid võivad teatud aja jooksul eksisteerida, kuid on täielikult isoleeritud.

Kõiki sisseehitatud nimesid sisaldav nimeruum luuakse Pythoni tõlgi käivitamisel ja eksisteerib seni, kuni tõlk töötab.

See on põhjus, et sisseehitatud funktsioone nagu id(), print()jne on alati olemas, et meid tahes osa programmist. Iga moodul loob oma globaalse nimeruumi.

Need erinevad nimeruumid on isoleeritud. Seega ei põrku kokku sama nimi, mis võib eksisteerida erinevates moodulites.

Moodulitel võivad olla erinevad funktsioonid ja klassid. Funktsiooni kutsumisel luuakse kohalik nimeruum, milles on kõik nimed määratletud. Sarnaselt on ka klassi puhul. Järgmine skeem võib aidata seda mõistet selgitada.

Pythoni erinevate nimeruumide skeem

Pythoni muutuv ulatus

Ehkki määratletud on mitu ainulaadset nimeruumi, ei pruugi meil olla võimalik neile kõigile programmi igast osast juurde pääseda. Mängu tuleb ulatuse mõiste.

Reguleerimisala on programmi osa, kust nimeruumile pääseb otse juurde ilma prefiksita.

Igal ajahetkel on vähemalt kolm pesastatud ulatust.

  1. Praeguse kohaliku nimega funktsiooni ulatus
  2. Globaalse nimega mooduli ulatus
  3. Äärmine ulatus, millel on sisseehitatud nimed

Kui viide tehakse funktsiooni sees, otsitakse nime kohalikust nimeruumist, seejärel globaalsest nimeruumist ja lõpuks sisseehitatud nimeruumist.

Kui mõne muu funktsiooni sees on funktsioon, pesitseb uus ulatus uue kohaliku ulatuse sisse.

Näide Pythoni ulatusest ja nimeruumist

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

Siin on muutuja a globaalses nimeruumis. Muutuja b asub domeeni kohalikus nimeruumis outer_function()ja c on koha pesastatud kohalikus nimeruumis inner_function().

Kui oleme sees inner_function(), on c meie jaoks lokaalne, b on mittekohaline ja a on globaalne. Me võime nii lugeda kui ka määrata c-le uusi väärtusi, kuid võime lugeda ainult b ja a inner_function().

Kui proovime väärtusele b omistada väärtuse, luuakse kohalikus nimeruumis uus muutuja b, mis erineb mittekohalikust b. Sama juhtub ka siis, kui omistame a-le väärtuse.

Kui aga kuulutame a globaalseks, lähevad kõik viited ja määrangud globaalsele a. Samamoodi, kui tahame muutujat b uuesti siduda, tuleb see deklareerida mittekohalikuna. Järgmine näide selgitab seda veelgi.

 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)

Nagu näete, on selle programmi väljund

 a = 30 a = 20 a = 10

Selles programmis on kolm erinevat muutujat a määratletud eraldi nimeruumides ja neile pääseb vastavalt juurde. Järgmises programmis olles

 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)

Programmi väljund on.

 a = 30 a = 30 a = 30 

Siin on märksõna kasutamise tõttu kõik viited ja määrangud globaalsele a-le global.

Huvitavad Artiklid...