Passera Reference vs. Value i Python

Pass Reference Vs



Efter att ha känt till Python kan du hitta exempel där funktionerna inte ändrar argumenten på en plats som du förväntar dig, särskilt om du är bekant med många andra datorspråk. Många språk använder metodargument som referenser, definierade som passerar genom Referens till aktuella variabler. Om du är en avancerad Python -utvecklare som vill förstå Pythons speciella sätt att behandla metodargument, är den här guiden verkligen något för dig.

Python stöder Pass by Object Reference

Pass-by-reference och pass-by-value är onekligen de två mest välkända och lättbegripliga sätten att parameterpassera mellan programmeringsspråk. Python är tyvärr 'pass-by-object-reference', varken Pass by Value eller Pass by Reference, ofta kallad Call by Object Reference samt Call by Sharing. Det är användbart att titta närmare på själva konceptet genom att dela upp det i segment medan du fördjupar dig i de tekniska detaljerna för att gå förbi Referens:







Passera: detta innebär att förse en metod med ett argument.



Genom hänvisning: detta betyder att argumentet du flyttar över till metoden hänvisar till en variabel som nu finns i lagring istället för en annan kopia av den variabeln.



När du tilldelar metoden en referens till en definierad variabel, påverkas variabeln den motsvarar uttryckligen av alla operationer i denna referens. Låt oss nu överväga ett exempel på hur detta i praktiken fungerar. I det här exemplet har vi definierat en variabel ' arg’ har ett värde av 4 . Under hela detta scenario är variabeln ' arg’ ändrades inte i stället. Python verkar hantera ditt angivna argument istället för en hänvisning till en nuvarande variabel som ett fristående värde.





Skulle detta innebära att Python flyttar argument efter värde istället för genom Reference? Python flyttar argument genom tilldelning, så varken med referens eller med värde. Logiken för detta är tvåfaldig:



För närvarande är parametern som skickar in en pekare till ett objekt. Vissa typer av data är muterbara och vissa är inte muterbara.

Om vi ​​flyttar ett föränderligt objekt till en funktion, förvärvar funktionen en referens till samma objekt så att du kan mutera det hela till din själs tillfredsställelse; det externa omfånget skulle dock inte veta någonting innan du återansluter referensen i funktionen. När du är klar kommer den externa referensen bara att sikta på det faktiska objektet. Om du flyttar ett oföränderligt objekt till en funktion kan den externa referensen alltid inte bindas om och du kan inte bara mutera objektet. För att göra saker mycket enklare, låt oss förstå en efter en.

Pass By Reference

Först och främst måste du förstå att variabeln 'mylist' i sig inte är en lista utan refererar till en lista som har värden. Du kan kalla variabeln 'mylist' för en behållare med värden i den. Listvärdena är objekt. Variabeln 'mylist' har levererats direkt till funktionen med dess innehåll.

Både listan och min lista verkar vara samma lagringsvariabel i kodexemplet nedan och gäller således för samma lagringsobjekt. Därför skriver den ut 'Saeed' på utmatningen.

Varje åtgärd som utförs på variabeln eller enheten speglas omedelbart till uppringningsmetoden. Metoden kan helt ändra variabelns värde och rikta den mot ett helt distinkt objekt. Som du kan se i funktionen 'set_list' har vi ändrat listans innehåll och skrivit ut en helt ny lista med elementet 'Aqsa.' Detta beror på att vi har returnerat den modifierade listan och skrivit ut den på samma rad som den som ringer.

Metoden kan också omfördela variabelns element för samma resultat som nedan. Du kan se att vi har lagt till ett nytt värde i listan och ändringen har reflekterats. Vi har lagt till en unik sträng i en lista och returnerat den till den som ringer. Avslutningsvis har metoden och den som ringer använt samma variabel och objekt i hela förbigångsrelationen.

Gå förbi Value

Genom pass by -value levereras metoden med en kopia av argumentobjektet som den som ringer tilldelar det. Detta säkerställer att det ursprungliga objektet förblir oförändrat och att alla ändringar görs kvar på separata minnesplatser i en kopia av samma objekt.

Det är lika giltigt med alla operationer som utförs på en variabel eller enheten med metoden. Dubbletter av variabler och objekt i uppringningsmetodens omfattning är helt åtskilda för att sammanfatta dem.

Passera objekt genom referens

Under hela denna situation, eftersom Python är distinkt, får Pythons metoder den mycket liknande objektreferensen i lagringen som den som ringer refererar till. Omvänt får tekniken inte variabeln 'mylist' (behållaren). Uppringningsmetoden lagrar samma objekt; metoden genererar sin behållare och genererar ett helt nytt index för sitt eget, precis som i pass-by-value.

Den som ringer och metoden talar om samma objekt i lagringen, men när den bifogade metoden tillämpar ett externt objekt på en lista ändras den som ringer upp. De har flera etiketter, men det är samma saker. Båda variablerna har ett mycket liknande objekt. Det är meningen bakom dess relation till rörelse av objektet. I lagringen använder metoden och den som ringer ett liknande objekt men tar dem genom flera variabler. Uppringningsvariabeln (behållaren) kommer inte att ändras av några modifieringar av metodvariabeln (behållaren); endast data eller innehållet ändras.

Slutsats

Python fungerar oberoende av språk som accepterar flyttning av referens eller värde av argument. Metodargument är lokala variabler som har tilldelats varje värde som överförs till metoden. Men det hindrar fortfarande inte dig från att uppnå samma resultat som du skulle hitta på andra språk när du flyttar argument genom proxy.