Gå forbi referanse vs. verdi i Python

Pass Reference Vs



Etter å ha kjent Python, kan du finne tilfeller der funksjonene ikke endrer argumentene på et sted som du ville forutse, spesielt hvis du er kjent med mange andre dataspråk. Mange språk bruker metodeargumenter som referanser, definert som å gå forbi Referanse til nåværende variabler. Hvis du er en avansert Python -utvikler som ønsker å forstå Pythons spesielle måte å behandle metodeargumenter, så er denne guiden virkelig noe for deg.

Python støtter Pass by Object Reference

Pass-by-reference og pass-by-value er unektelig de to mest anerkjente og lett forståelige måtene for parameteroverføring mellom programmeringsspråk. Python er dessverre 'pass-by-object-reference', verken Pass by Value eller Pass by Reference, ofte betegnet som Call by Object Reference så vel som Call by Sharing. Det er nyttig å se nærmere på selve konseptet ved å dele det ned i segmenter mens du stuper inn i de tekniske detaljene ved å gå forbi Reference:







Sende: dette betyr å gi en metode et argument.



Ved referanse: dette betyr at argumentet du flytter over til metoden refererer til en variabel som nå ligger i lagring i stedet for en annen kopi av den variabelen.



Når du tildeler metoden en referanse til en definert variabel, vil variabelen den tilsvarer eksplisitt påvirkes av alle operasjoner på denne referansen. La oss nå se på et eksempel på hvordan dette i praksis fungerer. I dette eksemplet har vi definert en variabel ‘ sint' har en verdi på 4 . Gjennom dette scenariet er variabelen ‘ sint' ble ikke modifisert i stedet. Python ser ut til å håndtere det angitte argumentet ditt i stedet for en referanse til en nåværende variabel som en selvstendig verdi.





Ville dette bety at i stedet for ved referanse flytter Python argumenter etter verdi? Python flytter argumenter gjennom tildeling, så verken ved referanse eller med verdi. Logikken for dette er todelt:



For øyeblikket er parameteren som sender inn en peker til et objekt. Enkelte typer data er mutable, og noen er ikke mutable.

Hvis vi flytter et objekt som kan forandres til en funksjon, får funksjonen en referanse til det samme objektet, slik at du kan mutere det hele til tilfredsstillelse av din sjel; Det eksterne omfanget vil imidlertid ikke vite noe før du blir med i referansen igjen i funksjonen. Når du er ferdig, vil den eksterne referansen bare sikte mot det faktiske objektet. Hvis du flytter et uforanderlig objekt til en funksjon, kan den eksterne referansen alltid ikke bindes på nytt, og du kan ikke bare mutere objektet. For å gjøre ting mye enklere, la oss forstå en etter en.

Gå forbi referanse

Først og fremst må du forstå at variabelen 'mylist' i seg selv ikke er en liste, men refererer til en liste som har verdier. Du kan kalle variabelen 'mylist' en beholder med verdier i den. Listeverdiene er objekter. 'Mylist' -variabelen har blitt direkte levert til funksjonen med innholdet.

Både listen og listen min ser ut til å være den samme lagringsvariabelen i kodeeksemplet nedenfor og gjelder dermed det samme lagringsobjektet. Det er derfor det skrives ut 'Saeed.'

Enhver handling som utføres på variabelen eller enheten vil umiddelbart bli speilet til oppringningsmetoden. Metoden kan helt endre verdien av variabelen og sikte den mot et helt distinkt objekt. Som du kan se i funksjonen 'set_list', har vi endret listeinnholdet og skrevet ut en helt ny liste med elementet 'Aqsa.' Dette er fordi vi har returnert den endrede listen og skrevet den ut på samme linje som den som ringer.

Metoden kan også omfordele variabelens elementer til samme resultat som nedenfor. Du kan se at vi har lagt til en ny verdi på listen, og endringen har blitt reflektert. Vi har lagt til en unik streng i en liste og returnert den til den som ringer. For å konkludere, har metoden og den som ringer brukt samme variabel og objekt i hele forbipasseringsforholdet.

Gå forbi verdi

Gjennom pass -by -verdi får metoden en duplikat av argumentobjektet som den som ringer tilordner den. Dette sikrer at det originale elementet forblir uendret og alle endringer som gjøres, beholdes på separate minnesteder i en kopi av det samme objektet.

Den er like gyldig for alle operasjoner som utføres på en variabel eller enheten med metoden. Dubletter av variabler og objekter i innringermetodens omfang er helt atskilt for å oppsummere dem.

Pass objekt ved referanse

I hele denne situasjonen, siden Python er distinkt, får Pythons metoder den svært like objektreferansen i lagringen som den som ringer refererer til. Omvendt får teknikken ikke variabelen 'mylist' (beholderen). Den som ringer lagrer det samme objektet; metoden genererer sin beholder og genererer en helt ny indeks for sin egen, akkurat som i forbi-verdi.

Den som ringer og metoden snakker om det samme objektet i lagringen, men når den vedlagte metoden bruker et eksternt element på en liste, blir innringerenheten endret. De har flere etiketter, men det er de samme tingene. Begge variablene har et veldig likt objekt. Det er følelsen bak det forholdet til bevegelse av objektet. I lagringen bruker metoden og den som ringer et lignende objekt, men tar dem gjennom flere variabler. Anropsvariabelen (beholderen) vil ikke bli endret av noen endringer i metodevariabelen (beholderen); bare dataene eller innholdet er endret.

Konklusjon

Python opererer uavhengig av språk som godtar flytting av referanse eller verdi av argumenter. Metodeargumenter er lokale variabler som har blitt tildelt hver verdi som overføres til metoden. Men det forhindrer deg fortsatt ikke i å oppnå de samme resultatene som du vil finne på andre språk mens du flytter argumenter med proxy.