Python navneområde og omfanget av en variabel

I denne opplæringen lærer du om navneområdet, kartlegging fra navn til objekter og omfanget av en variabel.

Hva er navn i Python?

Hvis du noen gang har lest 'The Zen of Python' (skriv import thisinn Python-tolken), sier den siste linjen, at Navnerom er en fabelaktig ide - la oss gjøre mer av dem! Så hva er disse mystiske navnerommene? La oss først se på hva navnet er.

Navn (også kalt identifikator) er ganske enkelt et navn gitt til objekter. Alt i Python er et objekt. Navn er en måte å få tilgang til det underliggende objektet.

Når vi for eksempel gjør oppgaven a = 2, 2er det et objekt som er lagret i minnet, og a er navnet vi forbinder det med. Vi kan få adressen (i RAM) til noe objekt gjennom den innebygde funksjonen id(). La oss se på hvordan du bruker den.

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

Produksjon

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

Her refererer begge til det samme objektet 2, så de har det samme id(). La oss gjøre ting litt mer interessante.

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

Produksjon

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

Hva skjer i trinnene ovenfor? La oss bruke et diagram for å forklare dette:

Minnediagram over variabler i Python

Opprinnelig blir et objekt 2opprettet og navnet a er assosiert med det. Når vi gjør det a = a+1, 3opprettes et nytt objekt og nå er a assosiert med dette objektet.

Merk deg at id(a)og id(3)har de samme verdiene.

Videre, når b = 2det kjøres, blir det nye navnet b knyttet til det forrige objektet 2.

Dette er effektivt ettersom Python ikke trenger å opprette et nytt duplikatobjekt. Denne dynamiske karakteren av navnebinding gjør Python kraftig; et navn kan referere til alle typer objekter.

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

Alle disse er gyldige og a vil referere til tre forskjellige typer objekter i forskjellige tilfeller. Funksjoner er også objekter, så et navn kan også referere til dem.

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

Produksjon

 Hallo

Det samme navnet a kan referere til en funksjon, og vi kan kalle funksjonen ved å bruke dette navnet.

Hva er et navneområde i Python?

Nå som vi forstår hva navn er, kan vi gå videre til begrepet navnerom.

For å si det enkelt, er et navneområde en samling av navn.

I Python kan du forestille deg et navneområde som en kartlegging av hvert navn du har definert til tilsvarende objekter.

Ulike navneområder kan eksistere samtidig på et gitt tidspunkt, men er helt isolerte.

Et navneområde som inneholder alle de innebygde navnene, opprettes når vi starter Python-tolken og eksisterer så lenge tolken kjører.

Dette er grunnen til at innebygde funksjoner som id(), print()etc. er alltid tilgjengelig for oss fra alle deler av programmet. Hver modul oppretter sitt eget globale navneområde.

Disse forskjellige navnerommene er isolerte. Derfor kolliderer ikke det samme navnet som kan eksistere i forskjellige moduler.

Moduler kan ha forskjellige funksjoner og klasser. Et lokalt navneområde opprettes når en funksjon kalles, som har alle navnene definert i seg. Lignende, er tilfellet med klasse. Følgende diagram kan bidra til å avklare dette konseptet.

Et diagram over forskjellige navnerom i Python

Python variabelt omfang

Selv om det er forskjellige unike navneområder definert, har vi kanskje ikke tilgang til alle fra alle deler av programmet. Begrepet omfang kommer inn i bildet.

Et omfang er den delen av et program hvorfra det er tilgang til et navneområde direkte uten prefiks.

Til enhver tid er det minst tre nestede omfang.

  1. Omfanget av den nåværende funksjonen som har lokale navn
  2. Omfanget av modulen som har globale navn
  3. Ytre omfang som har innebygde navn

Når det blir gjort en referanse i en funksjon, blir navnet søkt i det lokale navneområdet, deretter i det globale navneområdet og til slutt i det innebygde navnområdet.

Hvis det er en funksjon i en annen funksjon, er et nytt omfang nestet innenfor det lokale omfanget.

Eksempel på omfang og navneområde i Python

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

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 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)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

I dette programmet er tre forskjellige variabler a definert i separate navnerom og tilgang til deretter. Mens du er i det følgende programmet,

 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)

Resultatet av programmet er.

 a = 30 a = 30 a = 30 

Her er alle referanser og oppgaver til det globale a på grunn av bruk av nøkkelord global.

Interessante artikler...