Odovzdanie podľa referencie vs. hodnota v Pythone

Pass Reference Vs



Po znalosti jazyka Python môžete nájsť prípady, keď funkcie nezmenia argumenty na mieste, ako by ste očakávali, najmä ak poznáte mnoho ďalších počítačových jazykov. Mnoho jazykov používa ako referencie argumenty metódy, definované ako odovzdávanie odkazom na aktuálne premenné. Ak ste pokročilý vývojár Pythonu a chcete pochopiť konkrétny spôsob, akým Python zaobchádza s argumentmi metód, potom je táto príručka skutočne pre vás.

Python podporuje referenciu Pass by Object

Pass-by-reference a pass-by-value sú nepopierateľne dva najznámejšie a najzrozumiteľnejšie spôsoby prechodu parametrov medzi programovacími jazykmi. Python, bohužiaľ, nie je „referencia o objekte“, ani Pass by Value, ani Pass by Reference, často sa nazýva aj Call by Object Reference, ako aj Call by Sharing. Je užitočné pozrieť sa bližšie na samotný koncept tak, že ho rozdelíte na segmenty, pričom sa ponoríte do technických špecifík okolo referencie:







Prejsť: to znamená dodať metódu argumentom.



Podľa odkazu: to znamená, že argument, ktorý presuniete na metódu, sa týka premennej, ktorá sa teraz nachádza v úložisku namiesto inej repliky tejto premennej.



Keď metóde priradíte odkaz na definovanú premennú, premenná, ktorej zodpovedá, bude výslovne ovplyvnená všetkými operáciami v tejto referencii. Teraz sa pozrime na príklad, ako to v praxi funguje. V tomto prípade sme definovali premennú „ nahnevaný ' majúci hodnotu 4 . V celom tomto scenári je premenná „ nahnevaný ' nebol na svojom mieste upravený. Zdá sa, že Python spracováva váš poskytnutý argument namiesto odkazu na súčasnú premennú ako samostatnú hodnotu.





Znamenalo by to, že namiesto v Referencii Python presúva argumenty podľa hodnoty? Python presúva argumenty pomocou priradenia, takže nie podľa odkazu, ani s hodnotou. Logika je dvojaká:



V súčasnosti je odovzdávaným parametrom ukazovateľ na objekt. Niektoré typy údajov sú mutovateľné a niektoré nie sú mutovateľné.

Ak presunieme premenlivý predmet do funkcie, funkcia získa odkaz na ten istý predmet, takže ho môžete celý zmutovať k spokojnosti svojej duše; externý rozsah však nebude vedieť nič predtým, ako sa znova pripojíte k funkcii Reference. Keď skončíte, externá referencia bude mieriť iba na skutočný objekt. Ak presuniete nemeniteľný objekt na funkciu, externý odkaz sa nedá vždy znova prepojiť a nemôžete objekt iba zmutovať. Aby boli veci oveľa jednoduchšie, pochopme to jeden po druhom.

Prejdite referenciou

V prvom rade musíte pochopiť, že samotná premenná „mylist“ nie je zoznamom, ale odkazuje na zoznam s hodnotami. Premennú „mylist“ môžete nazvať kontajner, v ktorom sú hodnoty. Hodnoty v zozname sú objekty. Premenná „mylist“ bola priamo dodaná do funkcie s jej obsahom.

Zdá sa, že zoznam aj môj zoznam sú v nižšie uvedenom príklade kódu rovnakou premennou úložiska, a preto sa vzťahujú na ten istý objekt úložiska. Preto na výstupe vytlačí „Saeed“.

Akákoľvek akcia vykonaná s premennou alebo entitou by sa okamžite odzrkadlila v metóde volajúceho. Metóda môže úplne zmeniť hodnotu premennej a zamerať ju na úplne odlišný objekt. Ako vidíte vo funkcii „set_list“, zmenili sme obsah zoznamu a vytlačili sme úplne nový zoznam s prvkom „Aqsa“. Dôvodom je, že sme zmenený zoznam vrátili a vytlačili ho na rovnakom riadku ako volajúci.

Metóda môže tiež realokovať prvky premennej za rovnaký výsledok, ako je uvedené nižšie. Môžete vidieť, že sme k zoznamu pripojili novú hodnotu a zmena sa prejavila. Pripojili sme jedinečný reťazec k zoznamu a vrátili sme ho volajúcemu. Na záver možno povedať, že metóda a volajúci používali rovnakú vzťahovú premennú a objekt počas celého vzťahu pass-by.

Prejdite podľa hodnoty

Prostredníctvom hodnoty pass by metóda dostala duplikát objektu argumentu, ktorý mu volajúci priradí. To zaisťuje, že pôvodný prvok zostane nezmenený a všetky vykonané úpravy budú zachované na rôznych miestach pamäte v replike rovnakého objektu.

Platí to rovnako pre všetky operácie vykonávané na premennej alebo entite metódou. Duplikáty premenných a objektov v rozsahu metódy volajúceho sú na ich zhrnutie úplne oddelené.

Prejdite objekt podľa referencie

V celej tejto situácii, pretože Python je odlišný, metódy Pythonu získavajú v úložisku veľmi podobný odkaz na objekt, na ktorý odkazuje volajúci. Naopak, táto technika nezískava premennú „mylist“ (kontajner). Metóda volajúceho ukladá ten istý objekt; metóda generuje vlastný kontajner a generuje celkom nový vlastný index, rovnako ako v prípade hodnoty pass-by.

Volajúci a metóda hovoria o tom istom objekte v úložisku, ale keď pripojená metóda použije na zoznam externú položku, entita volajúceho sa zmení. Majú viacero štítkov, ale sú to rovnaké veci. Obe premenné držia veľmi podobný objekt. To je zmysel, ktorý má v pozadí jeho pohyb k objektu. V úložisku metóda a volajúci používajú podobný objekt, ale zachytávajú ich prostredníctvom viacerých premenných. Premenná volajúceho (kontajner) sa nezmení žiadnymi úpravami vykonanými v premennej metódy (kontajner); upravujú sa iba údaje alebo obsah.

Záver

Python funguje nezávisle od jazykov, ktoré akceptujú presúvanie pomocou odkazu alebo hodnoty argumentov. Argumenty metódy sú lokálne premenné, ktoré boli priradené ku každej hodnote prenesenej do metódy. To však stále nevylučuje, že pri presúvaní argumentov prostredníctvom zástupcu získate rovnaké výsledky, aké by ste našli v iných jazykoch.