Pass av referanse vs verdi i Python
Utviklere som hopper inn i Python-programmering fra andre språk som C++ og Java blir ofte forvirret av prosessen med å sende argumenter i Python. Den objektsentriske datamodellen og dens behandling av oppdrag er årsakene til forvirringen på det grunnleggende nivået.
I artikkelen vil vi diskutere begrepet hvordan sende en verdi ved referanse i Python og prøv å forstå forbigående referanseeksempler i Python.
Innholdsfortegnelse
- Pass by Value og Pass by Reference i Python
- Variabelen er ikke objektet
- Hva er Pass by Reference i Python?
- Hva er Pass by Value i Python?
Pass by Value og Pass by Reference i Python
Du vil kanskje slå noe etter å ha lest videre, så gjør deg klar. Pythons argumentovergangsmodell er verken Pass by Value eller Pass by Reference, men det er Pass by Object Reference.
Avhengig av typen objekt du sender i funksjonen, oppfører funksjonen seg annerledes. Uforanderlige objekter viser pass by-verdi, mens mutbare objekter viser pass by referanse.
Du kan sjekke forskjellen mellom pass-by-value og pass-by-referanse i eksemplet nedenfor:
Python3
def> call_by_value(x):> > x> => x> *> 2> > print> (> 'in function value updated to'> , x)> > return> > def> call_by_reference(> list> ):> > list> .append(> 'D'> )> > print> (> 'in function list updated to'> ,> list> )> > return> > my_list> => [> 'E'> ]> num> => 6> print> (> 'number before='> , num)> call_by_value(num)> print> (> 'after function num value='> , num)> print> (> 'list before'> ,my_list)> call_by_reference(my_list)> print> (> 'after function list is '> ,my_list)> |
Produksjon
number before= 6 in function value updated to 12 after function num value= 6 list before ['E'] in function list updated to ['E', 'D'] after function list is ['E', 'D']
I koden ovenfor har vi vist hvordan Python bruker call by reference objektkonsept i programmet sitt.
Vi sender et heltall i funksjonen call_by_value(). Heltall er uforanderlige objekter, derfor fungerer Python i henhold til kall etter verdi, og endringene som er gjort i funksjonen reflekteres ikke utenfor funksjonen.
Vi sender deretter listen til funksjon ved referanse. I funksjonen call_by_reference() sender vi en liste som er et muterbart objekt. Python fungerer i henhold til call by reference i denne funksjonen og endringene som er gjort inne i funksjonen kan også sees utenfor funksjonen.
Variabelen er ikke objektet
Her er a en variabel som peker til en liste som inneholder elementene X og Y. Men a selv er ikke en liste. Betrakt a som en bøtte som inneholder objektet X og Y.
a = ['X', 'Y']
Hva er Pass by Reference i Python?
Pass by reference betyr at du må sende funksjonen (referansen) til en variabel, som betyr at variabelen allerede finnes i minnet.
Her sendes variabelen (bøtten) direkte inn i funksjonen. Variabelen fungerer som en pakke som følger med innholdet (objektene).
I kodebildet ovenfor er både list og my_list den samme containervariabelen og refererer derfor til det samme objektet i minnet. Enhver operasjon utført av funksjonen på variabelen eller objektet vil bli direkte reflektert av funksjonsanroperen. For eksempel kan funksjonen endre variabelens innhold fullstendig og peke den mot et helt annet objekt:
Funksjonen kan også tilordne innholdet i variabelen på nytt med samme effekt som nedenfor:
For å oppsummere, i pass-by-referanse, bruker funksjonen og anroperen samme variabel og objekt.
Pass ved referanse i Python-eksempel
I dette eksemplet tar funksjonen modify_list en liste ved referanse. Funksjonen legger til strengen Geeks til den beståtte listen inne i funksjonen og skriver den ut. Siden lister er mutbare datatyper, reflekteres endringene som er gjort i listen inne i funksjonen også utenfor funksjonen som du kan se i utdataene.
Python3
def> modify_list(x):> > x.append(> 'Geeks'> )> > print> (> 'Inside function:'> , x)> > my_list> => [> 'Geeks'> ,> 'for'> ]> modify_list(my_list)> print> (> 'Outside function:'> , my_list)> |
Produksjon
Inside function: ['Geeks', 'for', 'Geeks'] Outside function: ['Geeks', 'for', 'Geeks']
Hva er Pass by Value i Python?
I denne tilnærmingen sender vi en kopi av de faktiske variabler i funksjonen som en parameter. Derfor vil ingen modifikasjon av parametere inne i funksjonen reflekteres i den faktiske variabelen.
Det samme gjelder for enhver operasjon utført av funksjonen på variabelen eller objektet
For å oppsummere er kopiene av variablene og objektene i konteksten til den som kaller funksjonen fullstendig isolert.
Pass av verdi i Python-eksempel
Her vil vi sende heltall x til funksjonen som er en uforanderlig datatype. Vi oppdaterer så verdien av heltallet inne i funksjonen og skriver ut den oppdaterte verdien. Endringene sees ikke utenfor funksjonen da heltall er uforanderlige datatyper.
Python3
def> modify_integer(x):> > x> => x> +> 10> > print> (> 'Inside function:'> , x)> > x> => 5> print> (> 'Before function call:'> , x)> modify_integer(x)> print> (> 'After function call:'> , x)> |
Produksjon:
Before function call: 5 Inside function: 15 After function call: 5
Python-programmering bruker pass by reference-objektkonsept mens den overfører verdier til funksjonene. Denne artikkelen prøver å vise deg konseptet pass by value og pass by reference i Python. Vi har vist forskjellige tilfeller av bestått verdier med eksempler. Å sende verdier til en funksjon i Python er forskjellig fra andre kodespråk, men med denne opplæringen kan du enkelt forstå konseptet og implementere det i arbeidet ditt.
Les også:
Er Python kall ved referanse eller kall etter verdi