Преминете чрез справка срещу стойност в Python

Pass Reference Vs



След като познавате Python, можете да намерите случаи, при които функциите не променят аргументите на място, както бихте очаквали, особено ако сте запознати с много други компютърни езици. Много езици използват аргументи на метода като препратки, дефинирани като преминаване чрез препратка към текущи променливи. Ако сте напреднал разработчик на Python, който иска да схване конкретния начин на Python да третира аргументите на метода, тогава това ръководство е наистина за вас.

Python поддържа Pass by Object Reference

Pass-by-reference и pass-by-value са безспорно двата най-добре разпознати и лесно разбираеми начина за преминаване на параметри между езиците за програмиране. Python, за съжаление, е „преминаване по обект-препратка“, нито преминаване по стойност, нито преминаване по референция, често наричано „обаждане по обект“, както и повикване чрез споделяне. Полезно е да разгледате по -отблизо самата концепция, като я разделите на сегменти, докато се потопите в техническите особености на преминаването през Reference:







Пропуск: това означава предоставяне на метод с аргумент.



Чрез справка: това означава, че аргументът, който премествате в метода, се отнася до променлива, която сега се намира в хранилището, вместо към различна реплика на тази променлива.



Докато присвоявате на метода препратка към дефинирана променлива, променливата, на която съответства, ще бъде изрично повлияна от всички операции с тази справка. Нека сега разгледаме пример за това как на практика това работи. В този пример дефинирахме променлива „ ядосан ' има стойност на 4 . В целия сценарий променливата „ ядосан ' не е променен на негово място. Python изглежда обработва предоставения от вас аргумент вместо препратка към настояща променлива като самостоятелна стойност.





Това означава ли, че вместо чрез Reference, Python премества аргументи по стойност? Python премества аргументи чрез присвояване, така че нито чрез препратка, нито със стойност. Логиката за това е двойна:



В момента преминаващият параметър е указател към обект. Някои видове данни са променливи, а някои не се променят.

Ако преместим променлив обект във функция, функцията придобива препратка към същия обект, така че можете да мутирате всичко това, за да задоволите душата си; външният обхват обаче няма да знае нищо, преди да се присъедините отново към препратката във функцията. След като приключите, външната справка ще се стреми само към действителния обект. Ако преместите неизменен обект във функция, външната справка не винаги може да бъде свързана отново и не можете просто да мутирате обекта. За да направим нещата много по -ясни, нека разберем едно по едно.

Преминаване по справка

На първо място, трябва да разберете, че самата променлива „mylist“ не е списък, а се отнася до списък със стойности. Можете да наречете променливата „mylist“ контейнер, съдържащ стойности в него. Стойностите на списъка са обекти. Променливата „mylist“ е доставена директно във функцията със съдържанието й.

И двата списъка и моят списък изглеждат една и съща променлива за съхранение в примера за код по -долу и по този начин се прилагат към същия обект за съхранение. Ето защо на изхода той отпечатва „Saeed“.

Всяко действие, извършено върху променливата или обекта, ще бъде незабавно отразено в метода на обаждащия се. Методът може изцяло да промени стойността на променливата и да я насочи към напълно различен обект. Както можете да видите във функцията „set_list“, сме променили съдържанието на списъка и сме отпечатали изцяло нов списък с елемент „Aqsa.“ Това е така, защото сме върнали модифицирания списък и го отпечатали на същия ред като обаждащия се.

Методът може също така да преразпредели елементите на променливата за същия резултат, както по -долу. Можете да видите, че сме добавили нова стойност към списъка и промяната е отразена. Ние добавихме уникален низ към списък и го върнахме на обаждащия се. В заключение, методът и обаждащият се използват една и съща променлива и обект по време на преходната връзка.

Преминете по стойност

Чрез преминаване по стойност методът се снабдява с дубликат на обекта на аргумент, който му се присвоява. Това гарантира, че оригиналният елемент остава непроменен и всички направени модификации се запазват на отделни места в паметта в реплика на същия обект.

То е еднакво валидно с всички операции, изпълнявани върху променлива или обект по метода. Дубликати на променливи и обекти в обхвата на метода на повикващия са напълно разделени, за да ги обобщят.

Предаване на обект чрез справка

В цялата тази ситуация, тъй като Python е различен, методите на Python получават много сходната референция на обект в хранилището, както се отнася до обаждащия се. Обратно, техниката не получава променливата „mylist“ (контейнера). Методът на обаждащия се съхранява същия обект; методът генерира контейнер и генерира напълно нов индекс за неговия собствен, точно както при преминаване по стойност.

Обаждащият се и методът говорят за един и същ обект в хранилището, но когато добавеният метод прилага външен елемент към списък, обектът на обаждащия се се променя. Те имат множество етикети, но са едни и същи неща. И двете променливи съдържат много сходен обект. Това е смисълът зад връзката му с движението по обекта. В хранилището методът и обаждащият се използват подобен обект, но ги улавят чрез множество променливи. Променливата на обаждащия се (контейнера) няма да бъде променена от никакви промени, направени в променливата на метода (контейнера); се променят само данните или съдържанието.

Заключение

Python работи независимо от езиците, които приемат преместването по Reference или стойност на аргументите. Аргументите на метода са локални променливи, които са разпределени към всяка стойност, прехвърлена към метода. Но това все още не ви пречи да постигнете същите резултати, които бихте намерили на други езици, докато премествате аргументи чрез прокси.