Praeiti pagal nuorodą ir vertę „Python“

Pass Reference Vs



Žinodami „Python“, galite rasti atvejų, kai funkcijos nepakeičia argumentų toje vietoje, kaip tikėjotės, ypač jei esate susipažinęs su daugeliu kitų kompiuterių kalbų. Daugelyje kalbų metodo argumentai naudojami kaip nuorodos, kurios apibrėžiamos kaip praėjimas pagal nuorodą į dabartinius kintamuosius. Jei esate pažangus „Python“ kūrėjas ir norite suprasti konkretų „Python“ metodo argumentų apdorojimo būdą, šis vadovas tikrai skirtas jums.

„Python“ palaiko leidimą pagal objektą

Pravažiavimo nuoroda ir pravažiavimo reikšmė neabejotinai yra du labiausiai atpažįstami ir lengvai suprantami būdai, kaip parametrai perduodami tarp programavimo kalbų. Deja, „Python“ yra „nuoroda į objektą“, nei praeiti pagal vertę, nei praeiti pagal nuorodą, dažnai vadinama skambučio pagal objektą nuoroda ir skambučiu dalijantis. Naudinga atidžiau pažvelgti į pačią sąvoką, suskaidant ją į segmentus, kai pasineriate į techninę praeities nuorodos specifiką:







Leidimas: tai reiškia metodo pateikimą su argumentu.



Pagal nuorodą: tai reiškia, kad argumentas, kurį perkeliate prie metodo, reiškia kintamąjį, kuris dabar yra saugykloje, o ne skirtingą to kintamojo kopiją.



Kai priskiriate metodui nuorodą į apibrėžtą kintamąjį, kintamąjį, kurį jis atitinka, tiesiogiai paveiks visos šios nuorodos operacijos. Dabar apsvarstykime pavyzdį, kaip tai praktiškai veikia. Šiame pavyzdyje mes apibrėžėme kintamąjį „ piktas' turintis vertę 4 . Viso šio scenarijaus metu kintamasis „ piktas' nebuvo pakeistas jo vietoje. Atrodo, kad „Python“ tvarko jūsų pateiktą argumentą, o ne nuorodą į esamą kintamąjį kaip savarankišką vertę.





Ar tai reikštų, kad vietoj nuorodos „Python“ perkelia argumentus pagal vertę? „Python“ perkelia argumentus per priskyrimą, taigi nei pagal nuorodą, nei pagal vertę. Tokia logika yra dvejopa:



Šiuo metu įeinantis parametras yra rodyklė į objektą. Tam tikros rūšies duomenys yra keičiami, o kai kurie - ne.

Jei perkeliame keičiamą objektą į funkciją, funkcija įgauna nuorodą į tą patį objektą, kad galėtumėte visa tai mutuoti savo sielos pasitenkinimui; tačiau išorinė apimtis nieko nežino, kol vėl prisijungsite prie funkcijos nuorodos. Kai baigsite, išorinė nuoroda bus nukreipta tik į tikrąjį objektą. Jei perkeliate nekintamą objektą į funkciją, išorinės nuorodos visada negalima susieti iš naujo ir jūs negalite tiesiog mutuoti objekto. Kad viskas būtų daug paprasčiau, supraskime po vieną.

Praeiti pagal nuorodą

Visų pirma, jūs turite suprasti, kad kintamasis „mylist“ nėra sąrašas, o nurodo sąrašą, kuriame yra reikšmių. Kintamąjį „mylist“ galite pavadinti konteineriu, kuriame yra reikšmių. Sąrašo vertės yra objektai. Kintamasis „mylist“ buvo tiesiogiai įtrauktas į funkciją su turiniu.

Atrodo, kad abu sąrašai ir mano sąrašas yra tas pats saugojimo kintamasis toliau pateiktame kodo pavyzdyje, todėl jie taikomi tam pačiam saugojimo objektui. Štai kodėl išvestyje jis spausdina „Saeed“.

Bet koks veiksmas, atliekamas su kintamuoju ar objektu, bus nedelsiant atspindėtas skambinančiojo metodu. Šis metodas gali visiškai pakeisti kintamojo vertę ir nukreipti jį į visiškai skirtingą objektą. Kaip matote funkcijoje „set_list“, mes pakeitėme sąrašo turinį ir išspausdinome visiškai naują sąrašą su elementu „Aqsa“. Taip yra todėl, kad grąžinome pakeistą sąrašą ir išspausdinome toje pačioje eilutėje kaip skambinantysis.

Šis metodas taip pat gali perskirstyti kintamojo elementus to paties rezultato, kaip nurodyta toliau. Matote, kad prie sąrašo pridėjome naują vertę, o pakeitimas atsispindi. Prie sąrašo pridėjome unikalią eilutę ir grąžinome ją skambinančiajam. Apibendrinant, metodas ir skambinantysis naudojo tą patį kintamąjį ir objektą per visą praeinamąjį ryšį.

Praeiti pagal vertę

Praeinant vertę, metodas pateikiamas su argumento objekto, kurį jam paskambina, dublikatu. Tai užtikrina, kad originalus elementas išliks nepakitęs ir visi atlikti pakeitimai bus išsaugoti atskirose atminties vietose to paties objekto kopijoje.

Jis vienodai galioja ir bet kokioms kintamojo ar subjekto metodu atliekamoms operacijoms. Skambinančiojo metodo taikymo srities kintamųjų ir objektų pasikartojimai yra visiškai atskirti, kad juos būtų galima apibendrinti.

Perduoti objektą pagal nuorodą

Visoje šioje situacijoje, kadangi „Python“ skiriasi, „Python“ metodai saugykloje gauna labai panašią objekto nuorodą, kaip nurodo skambinantysis. Priešingai, technika negauna kintamojo „mylist“ (konteineris). Skambintojo metodas saugo tą patį objektą; metodas sukuria konteinerį ir sukuria visiškai naują indeksą, kaip ir praeinančios vertės.

Skambinantysis ir metodas kalba apie tą patį saugykloje esantį objektą, tačiau kai pridėtas metodas sąrašui taiko išorinį elementą, skambinančiojo subjektas keičiamas. Jie turi keletą etikečių, tačiau tai yra tie patys dalykai. Abu kintamieji turi labai panašų objektą. Tai yra jausmas, susijęs su judėjimu objektu. Saugykloje metodas ir skambinantysis naudoja panašų objektą, tačiau sugauna juos per kelis kintamuosius. Skambinančiojo kintamasis (konteineris) nebus pakeistas jokiais metodo kintamojo (konteinerio) pakeitimais; keičiami tik duomenys arba turinys.

Išvada

„Python“ veikia nepriklausomai nuo kalbų, kurios priima perkėlimą pagal nuorodą arba argumentų vertę. Metodo argumentai yra vietiniai kintamieji, kurie buvo priskirti kiekvienai metodui perduodamai vertei. Tačiau tai vis tiek netrukdo jums pasiekti tų pačių rezultatų, kuriuos rastumėte kitomis kalbomis, perkeliant argumentus pagal įgaliotąjį.