Python-naamruimte en bereik van een variabele

In deze zelfstudie leert u over naamruimte, toewijzing van namen aan objecten en het bereik van een variabele.

Wat is naam in Python?

Als je ooit 'The Zen of Python' hebt gelezen (typ import thisde Python-interpreter in), zegt de laatste regel: Namespaces zijn een geweldig idee - laten we er meer van doen! Dus wat zijn deze mysterieuze naamruimten? Laten we eerst eens kijken wat de naam is.

Naam (ook wel identifier genoemd) is gewoon een naam die aan objecten wordt gegeven. Alles in Python is een object. Naam is een manier om toegang te krijgen tot het onderliggende object.

Wanneer we bijvoorbeeld de toewijzing uitvoeren a = 2, 2wordt een object in het geheugen opgeslagen en is a de naam waarmee we het associëren. We kunnen het adres (in RAM) van een object krijgen via de ingebouwde functie id(). Laten we eens kijken hoe we het kunnen gebruiken.

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

Uitvoer

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

Hier verwijzen beide naar hetzelfde object 2, dus ze hebben hetzelfde id(). Laten we de dingen een beetje interessanter maken.

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

Uitvoer

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

Wat gebeurt er in de bovenstaande stappen? Laten we een diagram gebruiken om dit uit te leggen:

Geheugendiagram van variabelen in Python

Aanvankelijk wordt een object 2gemaakt en de naam a is ermee geassocieerd, als we dat doen a = a+1, wordt een nieuw object 3gemaakt en nu is er een geassocieerd met dit object.

Merk op dat id(a)en id(3)dezelfde waarden hebben.

Bovendien, wanneer b = 2wordt uitgevoerd, wordt de nieuwe naam b geassocieerd met het vorige object 2.

Dit is efficiënt omdat Python geen nieuw duplicaat-object hoeft te maken. Deze dynamische aard van naambinding maakt Python krachtig; een naam kan verwijzen naar elk type object.

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

Al deze zijn geldig en een zal verwijzen naar drie verschillende soorten objecten in verschillende gevallen. Functies zijn ook objecten, dus een naam kan er ook naar verwijzen.

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

Uitvoer

 Hallo

Dezelfde naam a kan verwijzen naar een functie en we kunnen de functie aanroepen met deze naam.

Wat is een naamruimte in Python?

Nu we begrijpen wat namen zijn, kunnen we verder gaan met het concept van naamruimten.

Simpel gezegd: een naamruimte is een verzameling namen.

In Python kun je je een naamruimte voorstellen als een toewijzing van elke naam die je hebt gedefinieerd aan corresponderende objecten.

Verschillende naamruimten kunnen op een bepaald moment naast elkaar bestaan, maar zijn volledig geïsoleerd.

Een naamruimte met alle ingebouwde namen wordt aangemaakt wanneer we de Python-interpreter starten en blijft bestaan ​​zolang de interpreter draait.

Dit is de reden dat ingebouwde functies zoals id(), print()etc. altijd voor ons beschikbaar zijn vanuit elk deel van het programma. Elke module maakt zijn eigen globale naamruimte.

Deze verschillende naamruimten zijn geïsoleerd. Vandaar dat dezelfde naam die mogelijk in verschillende modules voorkomt, niet in botsing komt.

Modules kunnen verschillende functies en klassen hebben. Er wordt een lokale naamruimte gemaakt wanneer een functie wordt aangeroepen, waarin alle namen zijn gedefinieerd. Hetzelfde geldt voor klasse. Het volgende diagram kan dit concept helpen verduidelijken.

Een diagram van verschillende naamruimten in Python

Python-variabel bereik

Hoewel er verschillende unieke naamruimten zijn gedefinieerd, is het mogelijk dat we ze niet allemaal vanuit elk onderdeel van het programma kunnen openen. Het concept van scope speelt een rol.

Een bereik is het gedeelte van een programma van waaruit een naamruimte rechtstreeks toegankelijk is zonder voorvoegsel.

Op elk moment zijn er ten minste drie geneste bereiken.

  1. Bereik van de huidige functie die lokale namen heeft
  2. Reikwijdte van de module met globale namen
  3. Buitenste bereik met ingebouwde namen

Wanneer een verwijzing wordt gemaakt binnen een functie, wordt de naam doorzocht in de lokale naamruimte, vervolgens in de algemene naamruimte en tenslotte in de ingebouwde naamruimte.

Als er een functie binnen een andere functie is, wordt een nieuw bereik genest binnen het lokale bereik.

Voorbeeld van bereik en naamruimte in 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

In dit programma worden drie verschillende variabelen a gedefinieerd in afzonderlijke naamruimten en dienovereenkomstig geopend. Terwijl u in het volgende programma bent,

 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)

De output van het programma is.

 a = 30 a = 30 a = 30 

Hier zijn alle verwijzingen en toewijzingen naar de globale a vanwege het gebruik van trefwoord global.

Interessante artikelen...