Python nosaukumvieta un mainīgā darbības joma

Šajā apmācībā jūs uzzināsit par nosaukumvietu, kartēšanu no nosaukumiem uz objektiem un mainīgā darbības jomu.

Kas ir nosaukums Python?

Ja esat kādreiz lasījis “Python zen” (ierakstiet import thisPython tulku), pēdējā rindiņā teikts, ka Vārdvietas ir viena lieliska ideja - darīsim vairāk no tām! Kādas ir šīs noslēpumainās nosaukumvietas? Vispirms apskatīsim, kas ir vārds.

Nosaukums (saukts arī par identifikatoru) ir vienkārši objektiem piešķirts nosaukums. Viss Pitonā ir objekts. Nosaukums ir veids, kā piekļūt pamatā esošajam objektam.

Piemēram, kad mēs veicam uzdevumu a = 2, 2tas ir objekts, kas saglabāts atmiņā, un a ir nosaukums, ar kuru mēs to saistām. Izmantojot iebūvēto funkciju, mēs varam iegūt kāda objekta adresi (RAM) id(). Apskatīsim, kā to izmantot.

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

Rezultāts

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

Šeit abi attiecas uz vienu un to pašu objektu 2, tāpēc viņiem ir vienāds id(). Padarīsim lietas mazliet interesantākas.

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

Rezultāts

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

Kas notiek iepriekš minētajā darbību secībā? Izmantosim diagrammu, lai to izskaidrotu:

Mainīgo lielumu atmiņas diagramma Python

Sākotnēji 2tiek izveidots objekts un ar to saistīts nosaukums a, kad mēs to darām a = a+1, 3tiek izveidots jauns objekts, un tagad ar šo objektu tiek saistīts a.

Ņemiet vērā, ka id(a), un id(3)ir tādas pašas vērtības.

Turklāt, kad b = 2tiek izpildīts, jaunais nosaukums b tiek saistīts ar iepriekšējo objektu 2.

Tas ir efektīvi, jo Python nav jāizveido jauns objekta dublikāts. Šis vārdu saistīšanas dinamiskais raksturs padara Python spēcīgu; nosaukums varētu attiekties uz jebkura veida objektiem.

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

Tie visi ir derīgi, un a atsauce uz trim dažādiem objektu veidiem dažādās instancēs. Arī funkcijas ir objekti, tāpēc nosaukums var atsaukties arī uz tiem.

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

Rezultāts

 Sveiki

Tas pats nosaukums a var atsaukties uz funkciju, un mēs varam izsaukt funkciju, izmantojot šo nosaukumu.

Kas ir nosaukumvieta Python?

Tagad, kad mēs esam sapratuši, kas ir nosaukumi, mēs varam pāriet uz nosaukumvietu jēdzienu.

Vienkārši sakot, nosaukumvieta ir vārdu kolekcija.

Programmā Python jūs varat iedomāties, ka nosaukumvieta ir visu jūsu definēto vārdu kartēšana atbilstošajiem objektiem.

Noteiktā laikā var pastāvēt dažādas nosaukumvietas, taču tās ir pilnībā izolētas.

Vārdamvieta, kurā ir visi iebūvētie nosaukumi, tiek izveidota, palaižot Python tulku, un pastāv tik ilgi, kamēr darbojas tulks.

Šī iemesla dēļ iebūvētās funkcijas, piemēram id(), print()utt., Mums vienmēr ir pieejamas no jebkuras programmas daļas. Katrs modulis izveido savu globālo nosaukumvietu.

Šīs dažādās nosaukumvietas ir izolētas. Tādējādi viens un tas pats nosaukums, kas var pastāvēt dažādos moduļos, nesaduras.

Moduļiem var būt dažādas funkcijas un klases. Vietējā nosaukumvieta tiek izveidota, kad tiek izsaukta funkcija, kurā ir definēti visi nosaukumi. Līdzīgi ir arī ar klasi. Sekojošā diagramma var palīdzēt precizēt šo jēdzienu.

Dažādu Python vārdu vietu diagramma

Python mainīgais tvērums

Lai gan ir definētas dažādas unikālas nosaukumvietas, mēs, iespējams, nevarēsim piekļūt tām visām no katras programmas daļas. Spēkā ir jomas jēdziens.

Darbības joma ir tā programmas daļa, no kuras vārda vietai var piekļūt tieši bez prefiksa.

Jebkurā brīdī ir vismaz trīs ligzdotas darbības jomas.

  1. Pašreizējās funkcijas, kurai ir vietējie nosaukumi, darbības joma
  2. Globālā nosaukuma moduļa darbības joma
  3. Tālākā darbības joma, kurai ir iebūvēti nosaukumi

Kad funkcijas iekšpusē ir atsauce, nosaukums tiek meklēts vietējā nosaukumvietā, pēc tam globālajā nosaukumvietā un visbeidzot iebūvētajā nosaukumvietā.

Ja citas funkcijas iekšpusē ir funkcija, vietējā darbības jomā tiek ievietota jauna darbības joma.

Darbības jomas un nosaukumvietas piemērs Python

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

Šeit mainīgais a atrodas globālajā vārdu telpā. Mainīgais b atrodas vietējā nosaukumvietā outer_function()un c ir ligzdotajā vietējā vārdu telpā inner_function().

Kad atrodamies inner_function(), c mums ir lokāls, b ir lokāls un a globāls. Mēs varam gan nolasīt, gan piešķirt jaunas vērtības c, bet varam nolasīt tikai b un a no inner_function().

Ja mēs mēģinām piešķirt vērtību b, vietējā nosaukumvietā tiek izveidots jauns mainīgais b, kas atšķiras no nemateriālā b. Tas pats notiek, kad piešķiram vērtību a.

Tomēr, ja mēs pasludinām a par globālu, visas atsauces un piešķiršana nonāk globālajā a. Līdzīgi, ja mēs vēlamies atsaistīt mainīgo b, tas jādeklarē kā nelokāls. Šis piemērs to vēl vairāk paskaidros.

 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)

Kā redzat, šīs programmas rezultāts ir

 a = 30 a = 20 a = 10

Šajā programmā trīs dažādi mainīgie a ir definēti atsevišķās nosaukumvietās un tiem atbilstoši piekļūst. Atrodoties šajā programmā,

 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)

Programmas iznākums ir.

 a = 30 a = 30 a = 30 

Šeit visas atsauces un piešķiršanas ir saistītas ar globālo a atslēgvārda izmantošanas dēļ global.

Interesanti raksti...