Python-nimitila ja muuttujan laajuus

Tässä opetusohjelmassa opit nimitilasta, kartoituksesta nimistä objektiin ja muuttujan laajuudesta.

Mikä on nimi Pythonissa?

Jos olet koskaan lukenut 'Pythonin zen' (kirjoita import thisPython-tulkkiin), viimeinen rivi kertoo, että nimitilat ovat yksi upea idea - teemme lisää niistä! Joten mitä nämä salaperäiset nimitilat ovat? Katsotaanpa ensin, mikä nimi on.

Nimi (kutsutaan myös tunnisteeksi) on yksinkertaisesti esineille annettu nimi. Kaikki Pythonissa on esine. Nimi on tapa käyttää taustalla olevaa objektia.

Esimerkiksi kun teemme tehtävän a = 2, 2on muistiin tallennettu objekti ja a on nimi, johon liitämme sen. Voimme saada jonkin objektin osoitteen (RAM-muistissa) sisäänrakennetun toiminnon kautta id(). Katsotaanpa, miten sitä käytetään.

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

Tuotos

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

Tässä molemmat viittaavat samaan esineeseen 2, joten niillä on sama id(). Tehdään asioista hieman mielenkiintoisempia.

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

Tuotos

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

Mitä tapahtuu yllä olevassa vaihejärjestyksessä? Selitetään tämä kaavion avulla:

Muuttujien muistikaavio Pythonissa

Aluksi luodaan objekti 2ja siihen liitetään nimi a. Kun teemme a = a+1, luodaan uusi objekti 3ja nyt siihen liitetään a.

Huomaa, että id(a)sekä id(3)samat arvot.

Lisäksi b = 2suoritettaessa uusi nimi b liitetään edelliseen objektiin 2.

Tämä on tehokasta, koska Pythonin ei tarvitse luoda uutta päällekkäistä objektia. Tämä nimen sidonnan dynaaminen luonne tekee Pythonista tehokkaan; nimi voi viitata mihin tahansa objektityyppiin.

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

Kaikki nämä ovat kelvollisia, ja a viittaa kolmeen erityyppiseen objektiin eri tapauksissa. Myös toiminnot ovat esineitä, joten nimi voi viitata niihinkin.

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

Tuotos

 Hei

Sama nimi a voi viitata funktioon ja voimme kutsua funktiota tällä nimellä.

Mikä on nimitila Pythonissa?

Nyt kun ymmärrämme, mitä nimet ovat, voimme siirtyä nimitilojen käsitteeseen.

Yksinkertaisesti sanottuna nimitila on nimikokoelma.

Pythonissa voit kuvitella nimitilan kaikkien määrittelemiesi nimien kartoitukseksi vastaaville objekteille.

Eri nimitiloja voi olla olemassa samanaikaisesti, mutta ne ovat täysin eristettyjä.

Nimitila, joka sisältää kaikki sisäänrakennetut nimet, luodaan, kun käynnistämme Python-tulkin, ja se on olemassa niin kauan kuin tulkki toimii.

Tämä on syy, että rakenteen sisältämät toiminnot, kuten id(), print()jne ovat aina saatavilla meille mistä tahansa ohjelmasta. Jokainen moduuli luo oman globaalin nimitilan.

Nämä eri nimitilat ovat eristettyjä. Siksi sama nimi, joka voi olla olemassa eri moduuleissa, ei törmää.

Moduuleilla voi olla erilaisia ​​toimintoja ja luokkia. Paikallinen nimitila luodaan kutsuttaessa toimintoa, jossa kaikki nimet on määritelty. Samanlainen on luokkansa tapaus. Seuraava kaavio voi auttaa selventämään tätä käsitettä.

Kaavio Pythonin eri nimitiloista

Python-muuttuja

Vaikka yksilöllisiä nimitiloja on määritelty useita, emme välttämättä pysty käyttämään niitä kaikkia ohjelman kaikista osista. Laajuuden käsite tulee esiin.

Laajuus on ohjelman osa, josta nimitilaan pääsee suoraan ilman etuliitettä.

Kullakin hetkellä sisäkkäisiä laajuuksia on vähintään kolme.

  1. Nykyisen funktion laajuus, jolla on paikallisia nimiä
  2. Globaalien nimien moduulin laajuus
  3. Uloin ulottuvuus, jossa on sisäänrakennettuja nimiä

Kun viittaus tehdään funktion sisällä, nimeä haetaan paikallisesta nimiavaruudesta, sitten globaalista nimiavaruudesta ja lopuksi sisäänrakennetusta nimiavaruudesta.

Jos toisen toiminnon sisällä on toiminto, uusi laajuus on sisäkkäin paikallisen laajuuden sisällä.

Esimerkki Pythonin laajuudesta ja nimitilasta

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

Tässä muuttuja a on globaalissa nimiavaruudessa. Muuttuja b on paikallisessa nimitilassa outer_function()ja c on alueen sisäkkäisessä paikallisessa nimitilassa inner_function().

Kun olemme sisällä inner_function(), c on meille paikallinen, b on paikallinen ja a on globaali. Voimme lukea ja antaa c: lle uusia arvoja, mutta voimme lukea vain b ja a inner_function().

Jos yritämme määrittää arvoksi b, paikalliselle nimiavaruudelle luodaan uusi muuttuja b, joka on erilainen kuin ei-paikallinen b. Sama tapahtuu, kun osoitamme arvon a: lle.

Kuitenkin, jos julistamme a globaaliksi, kaikki viitteet ja tehtävät menevät globaaliin a. Vastaavasti, jos haluamme palata muuttujaan b, se on julistettava ei-paikalliseksi. Seuraava esimerkki selventää tätä.

 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)

Kuten näette, tämän ohjelman tulos on

 a = 30 a = 20 a = 10

Tässä ohjelmassa kolme erilaista muuttujaa a määritellään erillisissä nimitiloissa ja niitä käytetään vastaavasti. Seuraavassa ohjelmassa ollessasi

 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)

Ohjelman tuotos on.

 a = 30 a = 30 a = 30 

Tässä kaikki viittaukset ja tehtävät ovat globaalia a johtuen avainsanan käytöstä global.

Mielenkiintoisia artikkeleita...