Python-navneområde og omfang af en variabel

I denne vejledning lærer du om navneområdet, kortlægning fra navne til objekter og omfanget af en variabel.

Hvad er navn i Python?

Hvis du nogensinde har læst 'The Zen of Python' (indtast import thisPython-tolk), siger den sidste linje, at Navneområder er en tiltalende god idé - lad os gøre mere af dem! Så hvad er disse mystiske navneområder? Lad os først se på, hvad navnet er.

Navn (også kaldet identifikator) er simpelthen et navn, der gives til objekter. Alt i Python er et objekt. Navn er en måde at få adgang til det underliggende objekt.

For eksempel, når vi udfører opgaven a = 2, 2er et objekt gemt i hukommelsen, og a er det navn, vi forbinder det med. Vi kan få adressen (i RAM) til et eller andet objekt gennem den indbyggede funktion id(). Lad os se på, hvordan du bruger det.

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

Produktion

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

Her henviser begge til det samme objekt 2, så de har det samme id(). Lad os gøre tingene lidt mere 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))

Produktion

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

Hvad sker der i ovenstående trin? Lad os bruge et diagram til at forklare dette:

Hukommelsesdiagram over variabler i Python

Oprindeligt 2oprettes et objekt , og navnet a er knyttet til det, når vi gør det a = a+1, 3oprettes et nyt objekt , og nu er et associeret med dette objekt.

Bemærk, at id(a)og id(3)har de samme værdier.

Når b = 2det udføres, bliver det nye navn b desuden knyttet til det forrige objekt 2.

Dette er effektivt, da Python ikke behøver at oprette et nyt duplikatobjekt. Denne dynamiske karakter af navneindbinding gør Python kraftfuld; et navn kan henvise til enhver form for objekt.

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

Alle disse er gyldige, og a henviser til tre forskellige typer objekter i forskellige tilfælde. Funktioner er også objekter, så et navn kan også henvise til dem.

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

Produktion

 Hej

Det samme navn a kan henvise til en funktion, og vi kan kalde funktionen ved hjælp af dette navn.

Hvad er et navneområde i Python?

Nu hvor vi forstår, hvad navne er, kan vi gå videre til begrebet navneområder.

For blot at sige det er et navneområde en samling navne.

I Python kan du forestille dig et navneområde som en kortlægning af hvert navn, du har defineret til tilsvarende objekter.

Forskellige navneområder kan eksistere samtidig på et givet tidspunkt, men er helt isolerede.

Et navneområde, der indeholder alle de indbyggede navne, oprettes, når vi starter Python-tolken og eksisterer, så længe tolken kører.

Dette er grunden til, at indbyggede funktioner som id(), print()etc. er altid til rådighed for os fra en hvilken som helst del af programmet. Hvert modul opretter sit eget globale navneområde.

Disse forskellige navneområder er isolerede. Derfor kolliderer ikke det samme navn, der kan findes i forskellige moduler.

Moduler kan have forskellige funktioner og klasser. Et lokalt navneområde oprettes, når en funktion kaldes, som har alle navne defineret i den. Tilsvarende er tilfældet med klasse. Følgende diagram kan hjælpe med at afklare dette koncept.

Et diagram over forskellige navneområder i Python

Python-variabelt anvendelsesområde

Selvom der er defineret forskellige unikke navneområder, kan vi muligvis ikke få adgang til dem alle fra alle dele af programmet. Begrebet omfang kommer i spil.

Et omfang er den del af et program, hvorfra man kan få adgang til et navneområde direkte uden noget præfiks.

På ethvert givet tidspunkt er der mindst tre indlejrede rækkevidde.

  1. Omfanget af den aktuelle funktion, der har lokale navne
  2. Omfanget af modulet, der har globale navne
  3. Yderste rækkevidde, der har indbyggede navne

Når der foretages en reference inde i en funktion, søges navnet i det lokale navneområde, derefter i det globale navneområde og endelig i det indbyggede navneområde.

Hvis der er en funktion inde i en anden funktion, er et nyt omfang indlejret i det lokale omfang.

Eksempel på rækkevidde og navneområde i Python

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

Her er variablen a i det globale navneområde. Variabel b er i det lokale navneområde outer_function()og c er i det indlejrede lokale navneområde inner_function().

Når vi er i inner_function(), er c lokal for os, b er ikke-lokal og a er global. Vi kan læse såvel som tildele nye værdier til c, men kan kun læse b og a fra inner_function().

Hvis vi forsøger at tildele som en værdi til b, oprettes der en ny variabel b i det lokale navneområde, som er forskellig fra den ikke-lokale b. Den samme ting sker, når vi tildeler en værdi til en.

Men hvis vi erklærer et som globalt, går al reference og opgave til det globale a. Tilsvarende, hvis vi vil genindbinde variablen b, skal den erklæres som ikke-lokal. Det følgende eksempel forklarer dette yderligere.

 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)

Som du kan se, er output fra dette program

 a = 30 a = 20 a = 10

I dette program defineres tre forskellige variabler a i separate navneområder og tilgås i overensstemmelse hermed. Mens du er i det følgende program,

 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)

Programmets output er.

 a = 30 a = 30 a = 30 

Her er alle referencer og opgaver til det globale a på grund af brugen af ​​nøgleord global.

Interessante artikler...