Imenski prostor Python in obseg spremenljivke

V tej vadnici boste izvedeli več o imenskem prostoru, preslikavi imen v predmete in obsegu spremenljivke.

Kaj je ime v Pythonu?

Če ste že kdaj prebrali 'Zen of Python' (vnesite import thisv tolmač Python), zadnja vrstica navaja, da so prostori imen odlična ideja - naredimo še več! Kateri so torej ti skrivnostni prostori imen? Najprej si poglejmo, kaj je ime.

Ime (imenovano tudi identifikator) je preprosto ime predmetov. Vse v Pythonu je predmet. Ime je način za dostop do osnovnega predmeta.

Na primer, ko opravimo nalogo a = 2, 2je predmet shranjen v pomnilniku in je ime, s katerim ga povežemo. Z vgrajeno funkcijo lahko dobimo naslov (v RAM-u) nekega predmeta id(). Poglejmo, kako ga uporabiti.

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

Izhod

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

Tu se oba nanašata na isti predmet 2, torej imata enakega id(). Naredimo stvari nekoliko bolj zanimive.

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

Izhod

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

Kaj se dogaja v zgornjem zaporedju korakov? Za razlago uporabimo diagram:

Spominski diagram spremenljivk v Pythonu

Sprva se ustvari objekt 2in z njim se poveže ime a, ko to storimo a = a+1, se ustvari nov objekt 3in zdaj je s tem objektom povezan a.

Upoštevajte, da id(a)in id(3)imajo enake vrednote.

Poleg tega se po b = 2izvedbi novo ime b poveže s prejšnjim objektom 2.

To je učinkovito, saj Pythonu ni treba ustvariti novega podvojenega predmeta. Ta dinamična narava vezave imen naredi Python zmogljiv; ime se lahko nanaša na katero koli vrsto predmeta.

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

Vse so veljavne in a se nanaša na tri različne vrste predmetov v različnih primerih. Funkcije so tudi predmeti, zato se lahko ime nanaša tudi nanje.

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

Izhod

 zdravo

Isto ime a se lahko nanaša na funkcijo in funkcijo lahko pokličemo s tem imenom.

Kaj je imenski prostor v Pythonu?

Zdaj, ko razumemo, kaj so imena, lahko preidemo na koncept imenskih prostorov.

Preprosto povedano, imenski prostor je zbirka imen.

V Pythonu si lahko imenski prostor predstavljate kot preslikavo vsakega imena, ki ste ga definirali v ustrezne predmete.

Različni imenski prostori lahko v določenem času soobstajajo, vendar so popolnoma izolirani.

Imenski prostor, ki vsebuje vsa vgrajena imena, se ustvari, ko zaženemo tolmač Python in obstaja, dokler deluje tolmač.

To je razlog, da so nam vgrajene funkcije, kot id()so print()itd., Vedno na voljo v katerem koli delu programa. Vsak modul ustvari svoj globalni imenski prostor.

Ti različni imenski prostori so ločeni. Zato isto ime, ki obstaja v različnih modulih, ne trči.

Moduli imajo lahko različne funkcije in razrede. Lokalni imenski prostor se ustvari, ko pokličete funkcijo, ki ima v sebi definirana vsa imena. Podobno je tudi pri razredu. Naslednji diagram lahko pomaga razjasniti ta koncept.

Diagram različnih imenskih prostorov v Pythonu

Python spremenljiv obseg

Čeprav so opredeljeni različni unikatni prostori imen, morda ne bomo mogli dostopati do vseh iz vseh delov programa. V poštev pride koncept obsega.

Obseg je del programa, od koder je do imenskega prostora mogoče dostopati neposredno brez predpone.

V danem trenutku so vsaj trije ugnezdeni obsegi.

  1. Obseg trenutne funkcije z lokalnimi imeni
  2. Obseg modula, ki ima globalna imena
  3. Zunanji obseg z vgrajenimi imeni

Ko se v funkciji sklicuje, se ime išče v lokalnem imenskem prostoru, nato v globalnem imenskem prostoru in na koncu v vgrajenem imenskem prostoru.

Če je funkcija znotraj druge funkcije, je nov obseg ugnezden znotraj lokalnega obsega.

Primer področja uporabe in imenskega prostora v Pythonu

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

Tu je spremenljivka a v globalnem imenskem prostoru. Spremenljivka b je v lokalnem imenskem prostoru outer_function()in c je v ugnezdenem lokalnem imenskem prostoru inner_function().

Ko smo inner_function()notri, je c za nas lokalno, b je nelokalno in a je globalno. C lahko beremo in dodeljujemo nove vrednosti c, lahko pa beremo le b in a iz inner_function().

Če poskusimo b dodeliti kot vrednost b, se v lokalnem imenskem prostoru ustvari nova spremenljivka b, ki se razlikuje od nelokalne b. Enako se zgodi, ko dodelimo vrednost a.

Če pa a razglasimo za globalno, gre vsa referenca in dodelitev globalnemu a. Če želimo spremenljivko b ponovno povezati, jo moramo razglasiti za nelokalno. Naslednji primer bo to še pojasnil.

 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)

Kot lahko vidite, je rezultat tega programa

 a = 30 a = 20 a = 10

V tem programu so tri različne spremenljivke a definirane v ločenih imenskih prostorih in do njih dostopajo. Medtem ko ste v naslednjem programu,

 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)

Rezultat programa je.

 a = 30 a = 30 a = 30 

Tu so vse reference in dodelitve globalnemu a zaradi uporabe ključne besede global.

Zanimive Članki...