Iet garām atsaucei pret vērtību Python

Pass Reference Vs



Zinot Python, jūs varat atrast gadījumus, kad funkcijas nemaina argumentus vietā, kā jūs varētu paredzēt, it īpaši, ja esat iepazinies ar daudzām citām datoru valodām. Daudzās valodās kā atsauces tiek izmantoti metodes argumenti, kas definēti kā garāmgājēji Atsauce uz pašreizējiem mainīgajiem. Ja esat pieredzējis Python izstrādātājs, kurš vēlas izprast Python īpašo veidu, kā apstrādāt metodes argumentus, šī rokasgrāmata patiešām ir paredzēta jums.

Python atbalsta pāreju pēc objekta atsauces

Atsauce un garāmgājēja vērtība nenoliedzami ir divi vispazīstamākie un viegli saprotamākie parametru nodošanas veidi starp programmēšanas valodām. Diemžēl Python ir “atsauce uz objektu”, ne pēc vērtības, ne pēc norādes, ko bieži dēvē par zvana pa objektu atsauci, kā arī par koplietošanas zvanu. Ir lietderīgi rūpīgāk aplūkot pašu koncepciju, sadalot to segmentos, kamēr iedziļināties tehnikā, kas iet garām atsaucei:







Iet: tas nozīmē metodes piegādi ar argumentu.



Pēc atsauces: tas nozīmē, ka arguments, kuru pāriet uz metodi, attiecas uz mainīgo, kas tagad atrodas krātuvē, nevis uz šī mainīgā atšķirīgu kopiju.



Piešķirot metodei atsauci uz noteiktu mainīgo, mainīgo, kuram tas atbilst, tieši ietekmēs visas šīs atsauces darbības. Tagad apskatīsim piemēru tam, kā tas praksē darbojas. Šajā piemērā mēs esam definējuši mainīgo “ dusmīgs ' kam ir vērtība 4 . Visā šajā scenārijā mainīgais “ dusmīgs ' tā vietā netika mainīts. Šķiet, ka Python apstrādā jūsu sniegto argumentu, nevis atsauci uz pašreizējo mainīgo kā patstāvīgu vērtību.





Vai tas nozīmētu, ka atsauces vietā Python pārvieto argumentus pēc vērtības? Python pārvieto argumentus ar piešķiršanu, tāpēc ne pēc atsauces, ne ar vērtību. Loģika tam ir divējāda:



Pašlaik parametrs, kas tiek ievadīts, ir rādītājs uz objektu. Daži datu veidi ir maināmi, bet daži - nemainīgi.

Ja mēs pārvietojam maināmu objektu funkcijā, funkcija iegūst atsauci uz to pašu objektu, lai jūs varētu to visu mutēt, lai apmierinātu jūsu dvēseli; tomēr ārējā darbības joma neko nezina, pirms atkal pievienojaties funkcijas atsaucei. Kad esat pabeidzis, ārējā atsauce būs vērsta tikai uz faktisko objektu. Ja pārvietojat nemainīgu objektu uz funkciju, ārējo atsauci vienmēr nevar atkārtoti saistīt, un jūs nevarat vienkārši mutēt objektu. Lai padarītu lietas daudz vienkāršākas, sapratīsim vienu pēc otra.

Iet garām atsaucei

Pirmkārt, jums ir jāsaprot, ka mainīgais “mylist” nav saraksts, bet attiecas uz sarakstu ar vērtībām. Mainīgo “mylist” varat saukt par konteineru, kurā ir vērtības. Saraksta vērtības ir objekti. Mainīgais “mylist” ar saturu ir tieši ievadīts funkcijā.

Abi saraksti un mans saraksts, šķiet, ir viens un tas pats krātuves mainīgais zemāk esošajā koda piemērā un tādējādi attiecas uz to pašu krātuves objektu. Tāpēc izdrukā tas izdrukā “Saeed”.

Jebkura darbība, kas veikta ar mainīgo vai entītiju, nekavējoties tiks atspoguļota zvanītāja metodē. Metode var pilnībā mainīt mainīgā vērtību un mērķēt uz pilnīgi atšķirīgu objektu. Kā redzams funkcijā “set_list”, mēs esam mainījuši saraksta saturu un izdrukājuši pilnīgi jaunu sarakstu ar elementu “Aqsa”. Tas ir tāpēc, ka esam atgriezuši modificēto sarakstu un izdrukājuši to pašu rindu ar zvanītāju.

Metode var arī pārdalīt mainīgā elementus tādam pašam rezultātam kā zemāk. Jūs redzat, ka esam pievienojuši sarakstam jaunu vērtību, un izmaiņas ir atspoguļotas. Mēs sarakstam esam pievienojuši unikālu virkni un atgriezuši to zvanītājam. Visbeidzot, metode un zvanītājs ir izmantojuši vienu un to pašu mainīgo un objektu visā garāmgājēja attiecībās.

Iet garām vērtībai

Izmantojot vērtību, metode tiek piegādāta ar argumenta objekta dublikātu, ko zvanītājs tam piešķir. Tas nodrošina, ka sākotnējais vienums paliek nemainīgs un visas veiktās izmaiņas tiek saglabātas atsevišķās atmiņas vietās viena un tā paša objekta kopijā.

Tas ir vienlīdz derīgs visām operācijām, kas ar mainīgo vai entītiju tiek veiktas ar šo metodi. Zvanītāja metodes darbības jomā esošo mainīgo un objektu dublikāti ir pilnībā atdalīti, lai tos apkopotu.

Iziet objektu pēc atsauces

Visā šajā situācijā, tā kā Python ir atšķirīgs, Python metodes krātuvē iegūst ļoti līdzīgu objekta atsauci, uz kuru atsaucas zvanītājs. Un otrādi, šī metode nesaņem mainīgo “mylist” (konteiners). Zvanītāja metode saglabā to pašu objektu; metode ģenerē konteineru un ģenerē pavisam jaunu indeksu, tāpat kā garāmgājēju vērtību.

Zvanītājs un metode runā par vienu un to pašu objektu krātuvē, bet, kad pievienotā metode sarakstam piemēro ārēju vienumu, zvanītāja entītija tiek mainīta. Viņiem ir vairākas etiķetes, taču tās ir vienas un tās pašas lietas. Abiem mainīgajiem ir ļoti līdzīgs objekts. Tā ir sajūta, ka tā ir saistīta ar pārvietošanos pa objektu. Krātuvē metode un zvanītājs izmanto līdzīgu objektu, taču tos uztver, izmantojot vairākus mainīgos. Zvanītāja mainīgais (konteiners) netiks mainīts, veicot nekādas izmaiņas metodes mainīgajā (konteiners); tiek mainīti tikai dati vai saturs.

Secinājums

Python darbojas neatkarīgi no valodām, kas pieņem pārvietošanu pēc atsauces vai argumentu vērtības. Metodes argumenti ir vietējie mainīgie, kas piešķirti katrai metodei nodotajai vērtībai. Bet tas joprojām neliedz jums iegūt tādus pašus rezultātus, kādus varētu atrast citās valodās, vienlaikus pārvietojot argumentus pēc starpnieka.