Piton

Prođi referencu vs. Vrijednost u Pythonu

Prođi referencu vs. Vrijednost u Pythonu
Nakon poznavanja Pythona, možete pronaći slučajeve u kojima funkcije ne mijenjaju argumente na mjestu kao što biste očekivali, pogotovo ako ste upoznati s mnogim drugim računalnim jezicima. Mnogi jezici koriste argumente metoda kao reference, definirane kao prosljeđivanje putem reference na trenutne varijable. Ako ste napredni Python programer koji želi shvatiti Pythonov određeni način tretiranja argumenata metode, tada je ovaj vodič zaista za vas.

Python podržava prosljeđivanje referenci objekta

Pass-by-reference i pass-by-value nesumnjivo su dva najpoznatija i lako razumljiva načina za parametarsko prosljeđivanje između programskih jezika. Python je, nažalost, 'prosljeđivanje-objekta-referenca', niti "Prođi vrijednost" niti "Prođi referencu", često se naziva "Poziv referencom objekta", kao i "Poziv dijeljenjem.”Korisno je pažljivije pogledati sam koncept dijeljenjem na dijelove dok zaranjate u tehničke specifičnosti prolaska pored Reference:

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

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

Dok metodi dodjeljujete referencu na definiranu varijablu, na varijablu kojoj ona odgovara izričito će utjecati sve operacije na ovoj referenci. Razmotrimo sada primjer kako to u praksi funkcionira. U ovom smo primjeru definirali varijablu 'svađa koji imaju vrijednost 4. Tijekom ovog scenarija varijabla 'svađa nije modificiran na svom mjestu. Čini se da Python obrađuje vaš navedeni argument umjesto referencije na sadašnju varijablu kao samostalnu vrijednost.

Da li bi to značilo da umjesto pomoću Reference, Python argumente premješta po vrijednosti? Python premješta argumente kroz dodjelu, dakle ni referencom ni vrijednošću. Logika za to je dvojaka:

Trenutno je parametar koji se prosljeđuje pokazivač na objekt. Određene vrste podataka mogu se mijenjati, a neke se ne mogu mijenjati.

Ako promjenjivi objekt premjestimo u funkciju, funkcija dobiva referencu na isti objekt tako da možete sve to 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 usmjerit će se samo na stvarni objekt. Ako premjestite nepromjenjivi objekt u funkciju, vanjska se referenca uvijek ne može ponovno povezati i ne možete samo mutirati objekt. Da stvar bude mnogo jednostavnija, shvatimo jednu po jednu.

Prođi referencu

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 za pohranu u donjem primjeru koda i stoga se primjenjuju na isti objekt pohrane. Zato na izlazu 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 modificirani popis i ispisali ga u istom retku kao i pozivalac.

Metoda također može preraspodijeliti elemente varijable za isti rezultat kao u nastavku. Vidite da smo popisu dodali novu vrijednost i promjena se odrazila. Popisu smo dodali jedinstveni niz i vratili ga pozivatelju. Da zaključimo, metoda i pozivatelj koriste istu varijablu i objekt tijekom relacije prolaska.

Prođi vrijednost

Kroz prosljeđivanje vrijednosti, metoda se dobiva s duplikatom objekta argumenta koji joj pozivatelj dodijeli. To osigurava da izvorna stavka ostane nepromijenjena, a sve izvršene izmjene zadržavaju se na odvojenim memorijskim mjestima u replici istog predmeta.

Jednako vrijedi za sve operacije izvršene nad varijablom ili entitetom metodom. Duplikati varijabli i objekata u opsegu metode pozivatelja u potpunosti su odvojeni kako bi ih saželi.

Predaj objekt referencom

Tijekom ove situacije, budući da je Python različit, Pythonove metode dobivaju vrlo sličnu referencu na objekt u pohrani na koju se pozivatelj poziva. Suprotno tome, tehnika ne dobiva varijablu 'mylist' (spremnik). Metoda pozivatelja pohranjuje isti objekt; metoda generira nečiji spremnik i generira posve svježi indeks za svoj vlastiti, baš kao u prolaznoj vrijednosti.

Pozivatelj i metoda govore o istom objektu u spremištu, ali kada dodana metoda primijeni vanjsku stavku na popis, entitet pozivatelja se mijenja. Imaju više oznaka, ali to su iste stvari. Obje varijable sadrže vrlo sličan objekt. To je smisao koji stoji iza njegovog odnosa prema kretanju predmeta. U spremištu metoda i pozivatelj koriste sličan objekt, ali ih hvataju kroz više varijabli. Varijabla pozivatelja (spremnik) neće se mijenjati promjenama načinjenim na varijablu metode (spremnik); mijenjaju se samo podaci ili sadržaj.

Zaključak

Python djeluje neovisno od jezika koji prihvaćaju premještanje prema referenci ili vrijednosti argumenata. Argumenti metode su lokalne varijable koje su dodijeljene svakoj vrijednosti prenesenoj u metodu. Ali to vas još uvijek ne sprječava da postignete iste ishode koje biste pronašli na drugim jezicima dok premještate argumente putem proxyja.

Kako razviti igru ​​na Linuxu
Prije deset godina malo je Linux korisnika predviđalo da će njihov omiljeni operativni sustav jednog dana biti popularna platforma za igranje komercij...
Luke komercijalnih igara s otvorenim kodom
Besplatne igre s otvorenim kodom i više platformi mogu se koristiti za igranje starih, kao i nekih prilično nedavnih naslova igara. U ovom će se člank...
Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...