Pass by Reference vs. hodnota v Pythonu

Pass Reference Vs



Poté, co znáte Python, můžete najít instance, kde funkce nemění argumenty na místě, jak byste očekávali, zvláště pokud jste obeznámeni s mnoha dalšími počítačovými jazyky. Mnoho jazyků používá jako odkazy argumenty metod, definované jako předávání pomocí odkazu na aktuální proměnné. Pokud jste pokročilý vývojář Pythonu, který chce pochopit konkrétní způsob zpracování argumentů metody v Pythonu, pak je tento průvodce opravdu pro vás.

Python podporuje Pass by Object Reference

Pass-by-reference a pass-by-value jsou nepopiratelně dva nejuznávanější a nejsrozumitelnější způsoby předávání parametrů mezi programovacími jazyky. Python je, bohužel, „pass-by-object-reference“, ani Pass by Value ani Pass by Reference, často označovaný jako Call by Object Reference a také jako Call by Sharing. Je užitečné se blíže podívat na samotný koncept rozdělením na segmenty, zatímco se ponoříte do technických specifik předávání Reference:







Složit: to znamená dodat metodu argumentem.



Odkazem: to znamená, že argument, který přejdete na metodu, odkazuje na proměnnou, která nyní sídlí v úložišti místo jiné repliky této proměnné.



Když metodě přiřadíte odkaz na definovanou proměnnou, proměnná, které odpovídá, bude explicitně ovlivněna všemi operacemi s touto referencí. Nyní se podívejme na příklad, jak to v praxi funguje. V tomto příkladu jsme definovali proměnnou „ rozzlobený' mající hodnotu 4 . V celém tomto scénáři je proměnná „ rozzlobený' nebyl na svém místě upraven. Zdá se, že Python zpracovává zadaný argument namísto odkazu na aktuální proměnnou jako samostatnou hodnotu.





Znamenalo by to, že místo Reference by Python přesouval argumenty podle hodnoty? Python přesouvá argumenty prostřednictvím přiřazení, takže ani podle odkazu, ani s hodnotou. Logika je dvojí:



V současné době je předávaným parametrem ukazatel na objekt. Některé typy dat lze měnit a některé nelze měnit.

Pokud přesuneme do funkce proměnlivý předmět, funkce získá odkaz na stejný předmět, takže jej můžete celý zmutovat ke spokojenosti své duše; externí obor by však nic nevěděl, než se znovu připojíte k funkci Reference. Jakmile budete hotovi, externí reference bude mířit pouze na skutečný objekt. Pokud přesunete neměnný objekt na funkci, externí odkaz nelze vždy znovu spojit a nemůžete objekt pouze mutovat. Aby byly věci mnohem přímočařejší, pochopme to jeden po druhém.

Pass By Reference

Nejprve musíte pochopit, že samotná proměnná „mylist“ není seznam, ale odkazuje na seznam s hodnotami. Proměnnou „mylist“ můžete nazvat kontejner s hodnotami. Hodnoty seznamu jsou objekty. Proměnná „mylist“ byla přímo doručena do funkce s jejím obsahem.

Seznam list & my list se zdá být stejnou proměnnou úložiště v níže uvedeném příkladu kódu, a vztahuje se tedy na stejný objekt úložiště. Proto na výstupu vytiskne „Saeed“.

Jakákoli akce provedená na proměnné nebo entitě bude okamžitě zrcadlena do metody volajícího. Metoda může zcela změnit hodnotu proměnné a namířit ji na zcela odlišný objekt. Jak vidíte ve funkci „set_list“, změnili jsme obsah seznamu a vytiskli jsme úplně nový seznam s prvkem „Aqsa.“ Důvodem je, že jsme upravený seznam vrátili a vytiskli jej na stejném řádku jako volající.

Metoda může také přerozdělit prvky proměnné za stejný výsledek jako níže. Můžete vidět, že jsme do seznamu připojili novou hodnotu a změna se projevila. Připojili jsme jedinečný řetězec k seznamu a vrátili jej volajícímu. Abychom to uzavřeli, metoda a volající v relaci pass-by používaly stejnou proměnnou a objekt.

Projít podle hodnoty

Prostřednictvím hodnoty pass by byla metoda dodávána s duplikátem objektu argumentu, který mu volající přiřadí. Tím je zajištěno, že původní položka zůstane nezměněna a všechny provedené úpravy budou zachovány na různých místech paměti v replice stejného objektu.

Platí to stejně pro všechny operace prováděné na proměnné nebo entitě metodou. Duplikáty proměnných a objektů v rozsahu metody volajícího jsou pro jejich shrnutí zcela odděleny.

Předejte objekt referencí

V celé této situaci, protože Python je odlišný, získávají metody Pythonu v úložišti velmi podobný odkaz na objekt, na který odkazuje volající. Naopak tato technika nezíská proměnnou „mylist“ (kontejner). Metoda volajícího ukládá stejný objekt; metoda generuje vlastní kontejner a generuje zcela nový vlastní index, stejně jako v hodnotě pass-by.

Volající a metoda hovoří o stejném objektu v úložišti, ale když připojená metoda použije na seznam externí položku, entita volajícího se upraví. Mají více štítků, ale jsou to stejné věci. Obě proměnné obsahují velmi podobný objekt. To je ten smysl, který má zezadu jeho vztah k pohybu objektem. V úložišti metoda a volající používají podobný objekt, ale zachytí je prostřednictvím více proměnných. Proměnná volajícího (kontejner) nebude změněna žádnými úpravami provedenými v proměnné metody (kontejner); upravují se pouze data nebo obsah.

Závěr

Python funguje nezávisle na jazycích, které akceptují přesunutí pomocí Reference nebo hodnoty argumentů. Argumenty metody jsou lokální proměnné, které byly přiděleny každé hodnotě přenesené do metody. To ale stále nevylučuje, že při přesouvání argumentů pomocí proxy získáte stejné výsledky, jaké byste našli v jiných jazycích.