Prenesite referenco proti vrednosti v Pythonu

Pass Reference Vs



Ko poznate Python, lahko najdete primere, ko funkcije ne spremenijo argumentov na mestu, kot bi pričakovali, zlasti če poznate številne druge računalniške jezike. Mnogi jeziki uporabljajo argumente metode kot sklice, ki so opredeljeni kot podajanje mimo sklica na trenutne spremenljivke. Če ste napredni razvijalec Pythona in želite razumeti poseben način obravnave argumentov metode v Pythonu, potem je ta priročnik res za vas.

Python podpira Pass by Object Reference

Pass-by-reference in pass-by-value sta nedvomno dva najbolj prepoznavna in lahko razumljiva načina za podajanje parametrov med programskimi jeziki. Python je na žalost 'mimo-po-predmet-referenca', ni niti Pass by Value niti Pass by Reference, pogosto imenovan kot Call by Object Reference, pa tudi Call by Sharing. Koristno je, da si podrobneje ogledate sam koncept, tako da ga razdelite na segmente, medtem ko se potopite v tehnične posebnosti mimo reference:







Prevozi: to pomeni, da metodi priskrbimo argument.



Po referenci: to pomeni, da se argument, ki ga premaknete na metodo, nanaša na spremenljivko, ki je zdaj v shrambi, namesto na drugo repliko te spremenljivke.



Ko metodi dodelite referenco definirani spremenljivki, bi na njeno spremenljivko izrecno vplivale vse operacije v tej referenci. Zdaj pa razmislimo o primeru, kako to v praksi deluje. V tem primeru smo definirali spremenljivko ' jezen ' ki imajo vrednost 4 . V tem scenariju je spremenljivka ' jezen ' na svojem mestu ni bil spremenjen. Zdi se, da Python obravnava vaš podani argument namesto sklicevanja na sedanjo spremenljivko kot samostojno vrednost.





Ali bi to pomenilo, da namesto z referenco Python premika argumente po vrednosti? Python premika argumente z dodelitvijo, torej ne z referenco niti z vrednostjo. Logika tega je dvojna:



Trenutno je podani parameter kazalec na objekt. Nekatere vrste podatkov so spremenljive, nekatere pa ne.

Če spremenljiv predmet premaknemo v funkcijo, se funkcija sklicuje na isti predmet, tako da lahko vse to mutirate v zadovoljstvo svoje duše; zunanji obseg pa ne bi vedel ničesar, preden se ponovno pridružite sklicu v funkciji. Ko končate, bo zunanja referenca namenjena le dejanskemu objektu. Če premaknete nespremenljiv predmet v funkcijo, zunanjega sklica ni mogoče znova povezati in predmeta ne morete preprosto mutirati. Če želimo stvari narediti bolj enostavne, jih razumejmo eno za drugo.

Prenesite referenco

Najprej morate razumeti, da spremenljivka 'mylist' sama po sebi ni seznam, ampak se nanaša na seznam z vrednostmi. Spremenljivko 'mylist' lahko pokličete kot vsebnik, v katerem so vrednosti. Vrednosti seznama so predmeti. Spremenljivka 'mylist' je bila neposredno dostavljena v funkcijo z njeno vsebino.

Zdi se, da sta oba seznama in moj seznam ista spremenljivka v spodnjem primeru kode, zato veljata za isti objekt shranjevanja. Zato na izhodu natisne »Saeed«.

Vsa dejanja, izvedena na spremenljivki ali entiteti, bi bila takoj zrcaljena na metodo klicatelja. Metoda lahko v celoti spremeni vrednost spremenljivke in jo usmeri na popolnoma ločen predmet. Kot lahko vidite v funkciji 'set_list', smo spremenili vsebino seznama in natisnili popolnoma nov seznam z elementom 'Aqsa.' To je zato, ker smo vrnili spremenjeni seznam in ga natisnili v isti vrstici kot klicatelj.

Metoda lahko prerazporedi tudi elemente spremenljivke za enak rezultat kot spodaj. Vidite, da smo na seznam dodali novo vrednost, sprememba pa se je odrazila. Seznamu smo dodali edinstven niz in ga vrnili klicatelju. Skratka, metoda in klicatelj uporabljata isto spremenljivko in predmet v celotnem razmerju prehod.

Prenesite vrednost

Skozi prehodno vrednost se metodi dobavi dvojnik predmeta argumenta, ki mu ga klicatelj dodeli. To zagotavlja, da izvirni element ostane nespremenjen in da se vse izvedene spremembe shranijo na ločenih pomnilniških mestih v repliki istega predmeta.

Enako velja za vse operacije, ki se izvedejo na spremenljivki ali entiteti po metodi. Podvojene spremenljivke in objekti v obsegu metode klicatelja so popolnoma ločeni, da jih povzamemo.

Predmet podajte po referenci

V tem primeru, ker je Python ločen, Pythonove metode pridobijo v shrambi zelo podobno referenco predmeta, na katero se sklicuje klicatelj. Nasprotno pa tehnika ne pridobi spremenljivke 'mylist' (vsebnik). Metoda klicatelja shrani isti predmet; metoda ustvari svoj vsebnik in ustvari povsem nov indeks zase, tako kot pri prenosu vrednosti.

Klicatelj in metoda govorita o istem objektu v shrambi, ko pa priložena metoda uporabi zunanjo postavko na seznamu, se entiteta klicatelja spremeni. Imajo več oznak, vendar so iste stvari. Obe spremenljivki imata zelo podoben predmet. To je smisel njegove povezave s premikanjem po objektu. V pomnilniku metoda in klicatelj uporabljata podoben predmet, vendar ju ulovita skozi več spremenljivk. Spremenljivka klicatelja (vsebnik) ne bo spremenjena z nobenimi spremembami spremenljivke metode (vsebnik); spremenijo se samo podatki ali vsebina.

Zaključek

Python deluje neodvisno od jezikov, ki sprejemajo premikanje po referenci ali vrednosti argumentov. Argumenti metode so lokalne spremenljivke, ki so bile dodeljene vsaki vrednosti, preneseni v metodo. Toda to vam še vedno ne preprečuje, da bi med premikanjem argumentov po pooblastilu dosegli enake rezultate, kot bi jih našli v drugih jezikih.