Pass ved referanse vs. Verdi i Python

Pass ved referanse vs. Verdi i Python
Etter å ha kjent Python, kan du finne forekomster der funksjonene ikke endrer argumentene på et sted som du vil forvente, spesielt hvis du er kjent med mange andre dataspråk. Mange språk bruker metodeargumenter som referanser, definert som å sende med henvisning til gjeldende variabler. Hvis du er en avansert Python -utvikler som vil forstå Pythons spesielle måte å behandle metodeargumenter på, er denne guiden virkelig for deg.

Python støtter passering etter objektreferanse

Pass-by-Reference og Pass-by-Value er unektelig de to mest anerkjente og lett forståelige måtene å parameterere mellom programmeringsspråk. Python er, dessverre, 'Pass-by-Object-Reference,' verken "pass etter verdi" eller "pass etter referanse", ofte betegnet som "kall etter objektreferanse" så vel som "ring ved å dele.”Det er nyttig å se nærmere på selve konseptet ved å dele det ned i segmenter mens du stuper ned i de tekniske spesifikasjonene for å passere med referanse:

Sende: Dette betyr å levere en metode med et argument.

Med referanse: Dette betyr at argumentet du går 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 bli eksplisitt påvirket av alle operasjoner på denne referansen. La oss nå vurdere et eksempel på hvordan dette i praksis fungerer. I dette eksemplet har vi definert en variabel 'arg ' har en verdi av 4. Gjennom dette scenariet, variabelen 'arg ' ble ikke endret på sin plass. Python ser ut til å håndtere det oppgitte argumentet i stedet for en referanse til en nåværende variabel som en selvstendig verdi.

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

Foreløpig er parameteren som passerer inn en peker til et objekt. Visse typer data er mutable, og noen er ikke mutable.

Hvis vi flytter et mutabelt objekt inn i en funksjon, skaffer funksjonen en referanse til det samme objektet, slik at du kan mutere det hele til sjelenes tilfredshet; Imidlertid ville det ytre omfanget ikke vite noe før du blir med på referansen 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 bli bundet på nytt, og du kan ikke bare mutere objektet. For å gjøre ting mye mer greit, la oss forstå en etter en.

Pass på referanse

For det første 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 container som har verdier i den. Listeverdiene er objekter. "Mylist" -variabelen har blitt levert rett inn i funksjonen med innholdet.

Både “List” og “My List” ser ut til å være den samme lagringsvariabelen i kodeeksemplet nedenfor, og gjelder dermed det samme lagringsobjektet. Derfor skriver det ut.'

Enhver handling utført på variabelen eller enheten vil umiddelbart bli speilet til innringermetoden. Metoden kan helt endre verdien av variabelen og sikte den til et helt tydelig 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 modifiserte listen og skrevet den ut på samme linje som den som ringer.

Metoden kan også omfordele variabelenes elementer for samme resultat som nedenfor. Du kan se at vi har lagt en ny verdi til listen, og endringen har blitt reflektert. Vi har lagt en unik streng til en liste og returnert den til den som ringer. For å konkludere har metoden og den som ringer brukt den samme variabelen og objektet gjennom hele forholdet.

Passere etter verdi

Gjennom passering av verdi leveres metoden med en duplikat av argumentobjektet som den som ringer tildeler den. Dette sikrer at det opprinnelige elementet forblir uendret og at alle modifikasjoner som er gjort, beholdes på separate minneplasser i en kopi av samme objekt.

Det er like gyldig med alle operasjoner utført på en variabel eller enheten ved metoden. Duplikater av variabler og objekter i innringersmetodens omfang er helt atskilt for å oppsummere dem.

Passobjekt ved referanse

Gjennom denne situasjonen, siden Python er distinkt, oppnår Pythons metoder den svært lignende objektreferansen i lagringen som den som ringer refererer til. Motsatt oppnår ikke teknikken variabelen 'myList' (beholderen). Innringeren -metoden lagrer det samme objektet; Metoden genererer ens beholder og genererer en helt fersk indeks for sin egen, akkurat som i pass-for-verdi.

Innringeren og metoden snakker om det samme objektet i lagringen, men når den vedlagte metoden bruker et eksternt element på en liste, endres den som ringer enheten. De har flere etiketter, men de er de samme tingene. Begge variablene har et veldig likt objekt. Det er følelsen bak, og dets forhold til å bevege seg av objektet. I lagringen bruker metoden og den som ringer et lignende objekt, men fanger dem gjennom flere variabler. Innringervariabelen (beholderen) vil ikke bli endret av noen modifikasjoner gjort i metodevariabelen (beholderen); Bare dataene eller innholdet er endret.

Konklusjon

Python opererer uavhengig av språk som aksepterer bevegelse som referanse eller verdi av argumenter. Metodeargumenter er lokale variabler som er tildelt hver verdi overført til metoden. Men det utelukker fortsatt ikke at du får de samme resultatene du vil finne på andre språk mens du flytter argumenter ved fullmakt.