Gå forbi Reference kontra Værdi i Python

Pass Reference Vs



Efter at have kendt Python kan du finde tilfælde, hvor funktionerne ikke ændrer argumenterne et sted, som du ville forvente, især hvis du er bekendt med mange andre computersprog. Mange sprog bruger metodeargumenter som referencer, defineret som passering af Reference til aktuelle variabler. Hvis du er en avanceret Python -udvikler, der ønsker at forstå Pythons særlige måde at behandle metodeargumenter på, er denne vejledning virkelig noget for dig.

Python understøtter Pass by Object Reference

Pass-by-reference og pass-by-value er utvivlsomt de to mest velkendte og letforståelige måder til parameteroverførsel mellem programmeringssprog. Python er desværre 'pass-by-object-reference', hverken Pass by Value eller Pass by Reference, ofte betegnet som Call by Object Reference samt Call by Sharing. Det er nyttigt at se nærmere på selve konceptet ved at opdele det i segmenter, mens du kaster dig ud i de tekniske detaljer ved at gå forbi Reference:







Passere: dette betyder at levere en metode med et argument.



Ved reference: dette betyder, at det argument, du flytter over til metoden, refererer til en variabel, der nu ligger i lagring i stedet for en anden kopi af denne variabel.



Når du tildeler metoden en reference til en defineret variabel, vil variablen, den svarer til, eksplicit blive påvirket af alle operationer i denne reference. Lad os nu overveje et eksempel på, hvordan dette i praksis fungerer. I dette eksempel har vi defineret en variabel ' vred' har en værdi på 4 . I hele dette scenario er variablen ' vred' ikke blev ændret i stedet. Python ser ud til at håndtere dit angivne argument i stedet for en henvisning til en nuværende variabel som en selvstændig værdi.





Ville dette betyde, at Python i stedet for ved Reference flytter argumenter efter værdi? Python flytter argumenter gennem tildeling, så hverken ved reference eller med værdi. Logikken for dette er todelt:



I øjeblikket er parameteren, der sender ind, en markør til et objekt. Visse typer data kan ændres, og nogle kan ikke ændres.

Hvis vi flytter et omskifteligt objekt til en funktion, erhverver funktionen en reference til det samme objekt, så du kan mutere det hele til din sjæls tilfredshed; det eksterne område ville imidlertid ikke vide noget, før du igen tilmelder dig referencen i funktionen. Når du er færdig, vil den eksterne reference kun sigte mod det faktiske objekt. Hvis du flytter et uforanderligt objekt til en funktion, kan den eksterne reference altid ikke bindes igen, og du kan ikke bare mutere objektet. For at gøre tingene meget mere ligetil, lad os forstå en efter en.

Gå forbi reference

Først og fremmest skal du forstå, at variablen 'mylist' i sig selv ikke er en liste, men refererer til en liste, der har værdier. Du kan kalde variablen 'mylist' for en beholder med værdier i den. Listeværdierne er objekter. Variablen 'mylist' er blevet leveret direkte til funktionen med dens indhold.

Både liste og min liste ser ud til at være den samme lagervariabel i kodeeksemplet herunder og gælder dermed for det samme lagringsobjekt. Derfor udskriver det 'Saeed' på output.

Enhver handling udført på variablen eller enheden vil umiddelbart blive spejlet til opkaldsmetoden. Metoden kan helt ændre værdien af ​​variablen og sigte den mod et helt særskilt objekt. Som du kan se i funktionen 'set_list', har vi ændret listeindholdet og udskrevet en helt ny liste med elementet 'Aqsa.' Dette skyldes, at vi har returneret den ændrede liste og udskrevet den på samme linje som opkalderen.

Metoden kan også omfordele variabelens elementer til det samme resultat som nedenfor. Du kan se, at vi har tilføjet en ny værdi til listen, og ændringen er afspejlet. Vi har tilføjet en unik streng til en liste og returneret den til den, der ringer. Afslutningsvis har metoden og den, der ringer, brugt den samme variabel og objekt i hele pass-by-forholdet.

Gå forbi Værdi

Ved pass -by -værdi leveres metoden med en kopi af det argumentobjekt, som den, der ringer, tildeler det. Dette sikrer, at det originale element forbliver uændret, og alle foretagne ændringer bevares på separate hukommelsessteder i en kopi af det samme objekt.

Den er lige så gyldig med alle operationer, der udføres på en variabel eller enheden ved hjælp af metoden. Dubletter af variabler og objekter i opkaldsmetodens omfang er helt adskilt for at opsummere dem.

Overfør objekt ved reference

I hele denne situation, da Python er adskilt, opnår Pythons metoder den meget lignende objektreference i lageret, som opkalderen henviser til. Omvendt opnår teknikken ikke variablen 'mylist' (containeren). Opkaldsmetoden gemmer det samme objekt; metoden genererer sin beholder og genererer et helt nyt indeks for sit eget, ligesom i pass-by-value.

Opkalderen og metoden taler om det samme objekt i lageret, men når den vedlagte metode anvender et eksternt element på en liste, ændres den, der ringer op. De har flere etiketter, men det er de samme ting. Begge variabler har et meget lignende objekt. Det er følelsen bagved dets relation til bevægelse af objektet. I opbevaringen bruger metoden og opkalderen et lignende objekt, men alligevel fanger dem gennem flere variabler. Opkaldsvariablen (beholderen) ændres ikke ved ændringer, der foretages i metodevariablen (beholderen); kun dataene eller indholdet er ændret.

Konklusion

Python fungerer uafhængigt af sprog, der accepterer flytting af reference eller værdi af argumenter. Metodeargumenter er lokale variabler, der er allokeret til hver værdi, der overføres til metoden. Men det forhindrer stadig ikke dig i at opnå de samme resultater, som du ville finde på andre sprog, mens du flyttede argumenter ved proxy.