Prođite pored reference u odnosu na vrijednost u Pythonu

Pass Reference Vs



Nakon što ste upoznali Python, možete pronaći slučajeve u kojima funkcije ne mijenjaju argumente na mjestu kao što biste očekivali, osobito ako ste upoznati s mnogim drugim računalnim jezicima. Mnogi jezici koriste argumente metode kao reference, definirane kao prelazak uz referencu na trenutne varijable. Ako ste napredni programer Pythona koji želi shvatiti Pythonov poseban način tretiranja argumenata metode, onda je ovaj vodič zaista za vas.

Python podržava Pass by Object Reference

Pass-by-reference i pass-by-value nesumnjivo su dva najpoznatija i lako razumljiva načina parametriranja između programskih jezika. Python je, nažalost, 'prolaz-po-objekt-referenca', niti prolazi po vrijednosti niti prolazi po referenci, često se naziva i pozivom po objektu, kao i pozivom dijeljenjem. Korisno je pomnije pogledati sam koncept tako što ćete ga podijeliti na segmente dok se upuštate u tehničke specifičnosti prolaska pored Reference:







Proći: to znači pružanje metode argumentu.



Po referenci: to znači da se argument koji premjestite na metodu odnosi na varijablu koja se sada nalazi u pohrani umjesto na drugu repliku te varijable.



Kad metodi dodijelite referencu definiranoj varijabli, na varijablu kojoj ona odgovara izričito će utjecati sve operacije u ovoj referenci. Razmotrimo sada primjer kako to u praksi funkcionira. U ovom primjeru definirali smo varijablu ' ljut' ima vrijednost od 4 . U ovom scenariju varijabla ' ljut' nije mijenjana na svom mjestu. Čini se da Python obrađuje vaš argument umjesto reference na sadašnju varijablu kao samostalnu vrijednost.





Bi li to značilo da umjesto putem reference, Python pomiče argumente prema vrijednosti? Python premješta argumente kroz dodjelu, dakle ni po referenci niti s vrijednošću. Logika za to je dvostruka:



Trenutno je parametar koji se prikazuje pokazivač na objekt. Određene vrste podataka su promjenjive, a neke nisu promjenjive.

Ako premjestimo promjenjivi objekt u funkciju, funkcija dobiva referencu na isti objekt tako da sve to možete mutirati na zadovoljstvo svoje duše; međutim, vanjski opseg ne bi znao ništa prije nego što se ponovno pridružite referenci u funkciji. Kad završite, vanjska referenca ciljat će samo na stvarni objekt. Ako premjestite nepromjenjivi objekt u funkciju, vanjska referenca se uvijek ne može ponovno povezati i ne možete samo mutirati objekt. Da stvari budu jednostavnije, shvatimo jednu po jednu.

Proći referencom

Prije svega, morate shvatiti da varijabla 'mylist' sama po sebi nije popis, već se odnosi na popis koji ima vrijednosti. Varijablu 'mylist' možete nazvati spremnikom u kojem se nalaze vrijednosti. Vrijednosti popisa su objekti. Varijabla 'mylist' izravno je isporučena u funkciju sa svojim sadržajem.

Čini se da su i popis i moj popis ista varijabla pohrane u donjem primjeru koda i stoga se primjenjuju na isti objekt pohrane. Zato na ispisu ispisuje 'Saeed'.

Svaka radnja učinjena na varijabli ili entitetu odmah bi se preslikala na metodu pozivatelja. Metoda može u potpunosti izmijeniti vrijednost varijable i usmjeriti je na potpuno različit objekt. Kao što možete vidjeti u funkciji 'set_list', promijenili smo sadržaj popisa i ispisali cijeli novi popis s elementom 'Aqsa.' To je zato što smo vratili izmijenjeni popis i ispisali ga u istom retku kao i pozivatelj.

Metoda također može preraspodijeliti elemente varijable za isti rezultat kao u nastavku. Možete vidjeti da smo listi dodali novu vrijednost, a promjena se odrazila. Popisu smo dodali jedinstveni niz i vratili ga pozivatelju. Zaključno, metoda i pozivatelj su koristili istu varijablu i objekt tijekom prolazne veze.

Proslijedi vrijednost

Kroz prolaznu vrijednost, metoda se opskrbljuje duplikatom objekta argumenta koji mu pozivatelj dodjeljuje. Time se osigurava da izvorna stavka ostane nepromijenjena i da se sve izvršene izmjene zadrže na zasebnim memorijskim mjestima u replici istog objekta.

Jednako vrijedi za sve operacije izvedene na varijabli ili entitetu metodom. Duplikati varijabli i objekata u opsegu metode pozivatelja potpuno su odvojeni kako bi ih saželi.

Proslijedi objekt referencom

U cijeloj ovoj situaciji, budući da se Python razlikuje, Pythonove metode dobivaju vrlo sličnu referencu objekta u pohrani na koju se pozivatelj poziva. Nasuprot tome, tehnika ne dobiva varijablu 'mylist' (spremnik). Metoda pozivatelja pohranjuje isti objekt; metoda generira vlastiti spremnik i generira potpuno svjež indeks za vlastiti, baš kao i u prolaznoj vrijednosti.

Pozivatelj i metoda govore o istom objektu u pohrani, ali kada dodana metoda primijeni vanjsku stavku na popis, entitet pozivatelja se mijenja. Imaju više oznaka, ali to su iste stvari. Obje varijable drže vrlo sličan objekt. To je smisao iza njegove veze s kretanjem po objektu. U memoriji metoda i pozivatelj koriste sličan objekt, ali ih hvataju kroz više varijabli. Varijabla pozivatelja (spremnik) neće se promijeniti nikakvim izmjenama u varijabli metode (spremnik); samo se podaci ili sadržaj mijenjaju.

Zaključak

Python radi neovisno o jezicima koji prihvaćaju premještanje po referenci ili vrijednosti argumenata. Argumenti metode lokalne su varijable koje su dodijeljene svakoj vrijednosti prenesenoj u metodu. No to vas i dalje ne sprječava da postignete iste ishode koje biste pronašli u drugim jezicima dok premještate argumente putem posrednika.