„Python“ vardų sritis ir kintamojo apimtis

Šioje pamokoje sužinosite apie vardų sritį, žemėlapių sudarymą nuo vardų iki objektų ir kintamojo apimtį.

Kas yra vardas „Python“?

Jei kada nors skaitėte „Python zen“ (įveskite import this„Python“ vertėją), paskutinėje eilutėje sakoma, „ Vardų erdvės“ yra viena puikių idėjų - padarykime daugiau iš jų! Taigi, kas yra šios paslaptingos vardų erdvės? Pirmiausia pažiūrėkime, kas yra vardas.

Pavadinimas (dar vadinamas identifikatoriumi) yra tiesiog objektams suteiktas vardas. „Python“ viskas yra objektas. Pavadinimas yra būdas pasiekti pagrindinį objektą.

Pvz., Kai atliekame užduotį a = 2, 2tai yra objektas, saugomas atmintyje, ir yra vardas, su kuriuo jį susiejame. Kai kurių objektų adresą (RAM atmintyje) galime gauti naudodami integruotą funkciją id(). Pažvelkime, kaip jį naudoti.

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

Rezultatas

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

Čia abu nurodo tą patį objektą 2, taigi jie turi tą patį id(). Padarykime dalykus šiek tiek įdomiau.

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

Rezultatas

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

Kas vyksta aukščiau nurodytoje veiksmų sekoje? Panaudokime schemą, kad tai paaiškintume:

„Python“ kintamųjų atminties schema

Iš pradžių sukuriamas objektas 2ir su juo siejamas vardas a, kai mes tai darome a = a+1, sukuriamas naujas objektas, 3o dabar su šiuo objektu susiejamas a.

Atkreipkite dėmesį id(a)ir id(3)turėkite tas pačias vertes.

Be to, kai b = 2bus vykdomas, naujas vardas b bus susietas su ankstesniu objektu 2.

Tai efektyvu, nes „Python“ nereikia kurti naujo objekto dublikato. Šis dinamiškas vardų rišimo pobūdis daro „Python“ galingą; pavadinimas gali reikšti bet kokio tipo objektą.

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

Visa tai galioja, o testeris nurodo tris skirtingus objektų tipus skirtingais atvejais. Funkcijos taip pat yra objektai, todėl vardas taip pat gali jas nurodyti.

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

Rezultatas

 Sveiki

Tas pats pavadinimas a gali reikšti funkciją, o funkciją galime iškviesti naudodami šį pavadinimą.

Kas yra „Python“ vardų sritis?

Dabar, supratę, kokie yra pavadinimai, galime pereiti prie vardų srities sąvokos.

Paprasčiau tariant, vardų sritis yra vardų rinkinys.

„Python“ programoje vardų sritį galite įsivaizduoti kaip kiekvieno jūsų apibrėžto vardo susiejimą su atitinkamais objektais.

Tam tikru laiku gali egzistuoti skirtingos vardų erdvės, tačiau jos yra visiškai izoliuotos.

Vardų sritis, kurioje yra visi įmontuoti pavadinimai, sukuriama paleidus „Python“ vertėją ir egzistuoja tol, kol veikia vertėjas.

Tai yra priežastis, kodėl įmontuotos funkcijos, pvz. id(), Ir print()tt, mums visada prieinamos iš bet kurios programos dalies. Kiekvienas modulis sukuria savo pasaulinę vardų sritį.

Šios skirtingos vardų erdvės yra izoliuotos. Taigi tas pats pavadinimas, kuris gali egzistuoti skirtinguose moduliuose, nesusiduria.

Moduliai gali turėti įvairias funkcijas ir klases. Vietinė vardų sritis sukuriama iškviečiant funkciją, kurioje yra visi pavadinimai. Panašiai yra ir su klase. Ši diagrama gali padėti paaiškinti šią sąvoką.

Skirtingų „Python“ vardų sričių schema

„Python“ kintamasis taikymo sritis

Nors yra apibrėžtos įvairios unikalios vardų sritys, galbūt negalime pasiekti visų jų iš kiekvienos programos dalies. Pradedama veikti apimties samprata.

Taikymo sritis yra programos dalis, iš kurios galima tiesiogiai pasiekti vardų sritį be jokio priešdėlio.

Bet kurią akimirką yra bent trys įterpti taikymo sritis.

  1. Dabartinės funkcijos, turinčios vietinius pavadinimus, taikymo sritis
  2. Modulio, turinčio pasaulinius pavadinimus, taikymo sritis
  3. Atokiausia sritis, kurioje yra įmontuoti pavadinimai

Kai nuoroda daroma funkcijos viduje, vardas ieškomas vietinėje vardų srityje, tada visuotinėje vardų srityje ir galiausiai įmontuotoje vardų srityje.

Jei kitoje funkcijoje yra funkcija, nauja sritis yra įdėta į vietinę sritį.

Apimties ir vardų srities „Python“ pavyzdys

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

Čia kintamasis a yra pasaulinėje vardų srityje. Kintamasis b yra vietinėje vardų srityje outer_function()ir c yra įdėtoje vietinėje vardų srityje inner_function().

Kai esame inner_function(), c mums yra lokalus, b yra ne vietinis ir a yra globalus. Mes galime skaityti ir priskirti naujas reikšmes c, bet galime nuskaityti tik b ir a iš inner_function().

Jei bandysime priskirti b reikšmę, vietinėje vardų srityje sukuriamas naujas kintamasis b, kuris skiriasi nuo neblokalaus b. Tas pats atsitinka, kai a priskiriame vertę.

Tačiau, jei mes paskelbsime, kad visuotinis, visa nuoroda ir priskyrimas eina į globalinį a. Panašiai, jei norime susieti kintamąjį b, jis turi būti paskelbtas kaip nelokalus. Šis pavyzdys tai dar labiau paaiškins.

 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)

Kaip matote, šios programos išvestis yra

 a = 30 a = 20 a = 10

Šioje programoje trys skirtingi kintamieji a yra apibrėžti atskirose vardų erdvėse ir atitinkamai prieinami. Būdamas šioje programoje,

 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)

Programos išvestis yra.

 a = 30 a = 30 a = 30 

Čia visos nuorodos ir priskyrimai yra globalūs dėl raktinio žodžio naudojimo global.

Įdomios straipsniai...