Python поддържа препращане към препратка към обект
Pass-by-reference и pass-by-value са безспорно двата най-добре разпознати и лесно разбираеми начина за преминаване на параметри между езиците за програмиране. За съжаление Python е „препратка към обект-препратка“, нито „Предаване от стойност“, нито „Предаване от препратка“, често наричана „Обаждане чрез препратка към обект“, както и „Обаждане чрез споделяне“.„Полезно е да разгледате по-отблизо самата концепция, като я разделите на сегменти, докато се потопите в техническите специфики на преминаването от Референция:
Пропуск: това означава предоставяне на метод с аргумент.
По справка: това означава, че аргументът, който премествате в метода, се отнася до променлива, която сега се намира в хранилището вместо различна реплика на тази променлива.
Докато присвоявате на метода препратка към дефинирана променлива, променливата, на която тя отговаря, ще бъде изрично повлияна от всички операции с тази препратка. Сега нека разгледаме пример за това как на практика това работи. В този пример дефинирахме променлива 'спор със стойност от 4. По време на този сценарий променливата „спор не е модифициран на негово място. Изглежда, че Python обработва предоставения от вас аргумент, вместо препратка към настояща променлива като самостоятелна стойност.
Това би ли означавало, че вместо чрез Reference, Python премества аргументи по стойност? Python премества аргументи чрез присвояване, така че нито чрез Справка, нито със стойност. Логиката за това е двойна:
В момента параметърът, който се подава, е указател към обект. Определени типове данни могат да се променят, а някои не се променят.
Ако преместим изменяем обект във функция, функцията придобива препратка към същия обект, за да можете да мутирате всичко, за да удовлетворите душата си; външният обхват обаче няма да знае нищо, преди да се присъедините отново към референцията във функцията. След като приключите, външният справочник ще цели само действителния обект. Ако преместите неизменяем обект във функция, външната справка винаги не може да бъде свързана отново и не можете просто да мутирате обекта. За да направим нещата много по-ясни, нека разберем едно по едно.
Предайте референция
На първо място, трябва да разберете, че променливата 'mylist' сама по себе си не е списък, а се отнася до списък със стойности. Можете да извикате променливата 'mylist' контейнер със стойности в него. Стойностите в списъка са обекти. Променливата 'mylist' е директно доставена във функцията със съдържанието ѝ.
Както „списък“, така и „моят списък“ изглеждат една и съща променлива за съхранение в примера по-долу на кода и по този начин се прилагат към същия обект за съхранение. Ето защо на изход, той отпечатва 'Saeed.'
Всяко действие, извършено върху променливата или обекта, ще бъде незабавно огледално на метода на повикващия. Методът може изцяло да модифицира стойността на променливата и да я насочи към напълно различен обект. Както можете да видите във функцията 'set_list', сме променили съдържанието на списъка и сме отпечатали изцяло нов списък с елемента 'Aqsa.„Това е така, защото ние върнахме модифицирания списък и го отпечатахме на същия ред като обаждащия се.
Методът може също така да преразпредели елементите на променливата за същия резултат, както по-долу. Виждате, че сме добавили нова стойност към списъка и промяната е отразена. Добавихме уникален низ към списък и го върнахме на повикващия. В заключение, методът и повикващият са използвали една и съща променлива и обект през цялото отношение на преминаване.
Предайте по стойност
Чрез предаване по стойност методът се доставя с дубликат на аргументния обект, който повикващият му присвоява. Това гарантира, че оригиналният елемент остава непроменен и всички направени модификации се запазват на отделни места в паметта в реплика на същия обект.
Той е еднакво валиден за всички операции, изпълнявани върху променлива или обект по метода. Дубликати на променливи и обекти в обхвата на метода на повикващия са изцяло разделени, за да ги обобщят.
Предаване на обект по референция
По време на тази ситуация, тъй като Python е различен, методите на Python получават много подобна препратка към обекта в хранилището, към която се обажда повикващият. Обратно, техниката не получава променливата „mylist“ (контейнерът). Методът на повикващия съхранява същия обект; методът генерира нечий контейнер и генерира съвсем свеж индекс за своя собствена, точно както при предаване на стойност.
Повикващият и методът говорят за един и същ обект в хранилището, но когато добавеният метод прилага външен елемент към списък, обектът на повикващия се променя. Те имат множество етикети, но те са едни и същи неща. И двете променливи съдържат много подобен обект. Това е смисълът отзад на връзката му с движението на обекта. В хранилището методът и повикващият използват подобен обект, но все пак ги улавят чрез множество променливи. Променливата на повикващия (контейнерът) няма да бъде променена от модификации, направени в променливата на метода (контейнера); модифицират се само данните или съдържанието.
Заключение
Python работи независимо от езиците, които приемат преместването чрез Справка или стойност на аргументи. Аргументите на метода са локални променливи, които са разпределени за всяка стойност, прехвърлена към метода. Но това все още не ви пречи да постигнете същите резултати, които бихте намерили на други езици, докато премествате аргументи чрез прокси.