Przejść przez odniesienie vs. Wartość w Pythonie

Przejść przez odniesienie vs. Wartość w Pythonie
Po poznaniu Pythona możesz znaleźć przypadki, w których funkcje nie zmieniają argumentów w miejscu, jak można się spodziewać, szczególnie jeśli jesteś zaznajomiony z wieloma innymi językami komputerowymi. Wiele języków używa argumentów metod jako odniesień, zdefiniowanych jako przekazanie przez odniesienie do bieżących zmiennych. Jeśli jesteś zaawansowanym programistą Pythona, który chce zrozumieć szczególny sposób leczenia argumentów metody, ten przewodnik jest naprawdę dla Ciebie.

Python obsługuje podanie przez odniesienie do obiektu

Pass-by-Reference i Pass-by-Value są niezaprzeczalnie dwa najbardziej rozpoznane i łatwo zrozumiałe sposoby przechodzenia parametrów między językami programowania. Python jest, niestety, „Pass-by-Obietce-Reference”: „Ani„ mijaj wartość ”, ani„ przekaż przez odniesienie ”, często określane jako„ wywołanie odniesienia obiektowego ”, a także„ wywołanie, udostępnianie udostępniania.„Przydatne jest uważnie przyjrzeć się samej koncepcji, dzieląc ją na segmenty, gdy wpadasz na techniczne szczegóły przejścia przez odniesienie:

Przechodzić: Oznacza to dostarczenie metody argument.

Przez odniesienie: Oznacza to, że argument, który przeniesiasz do metody, odnosi się do zmiennej, która obecnie znajduje się w pamięci zamiast innej repliki tej zmiennej.

Podczas przypisywania metody odniesienia do zdefiniowanej zmiennej, na zmienną, na którą odpowiada, wpłynęłaby wszystkie operacje na tym odniesieniu. Rozważmy teraz przykład, w jaki sposób, w praktyce, to działa. W tym przykładzie zdefiniowaliśmy zmienną 'arg ' mając wartość 4. W tym scenariuszu zmienna ”arg ' nie został zmodyfikowany na swoim miejscu. Wydaje się, że Python obsługuje twój dostarczony argument zamiast odniesienia do obecnej zmiennej jako wartości samodzielnej.

Czy oznaczałoby to, że zamiast odniesienia, Python porusza argumenty o wartości? Python przesuwa argumenty poprzez przypisanie, więc ani przez odniesienie, ani z wartością. Logika tego jest dwukrotnie:

Obecnie przechodzący parametr jest wskaźnikiem do obiektu. Niektóre typy danych są zmienne, a niektóre nie są zmienne.

Jeśli przeniesiemy zmienny obiekt do funkcji, funkcja zdobywa odniesienie do tego samego obiektu, abyś mógł zmutować to wszystko do satysfakcji twojej duszy; Jednak zakres zewnętrzny nic nie wiedziałby, zanim dołączysz do odniesienia w funkcji. Po zakończeniu zewnętrzne odniesienie będzie miało na celu jedynie rzeczywisty obiekt. Jeśli przeniesiesz niezmienny obiekt do funkcji, zewnętrzne odniesienie zawsze nie można ponownie powiązać i nie możesz po prostu zmutować obiektu. Aby sprawić, że wszystko jest prostsze, zrozummy jeden po drugim.

Przejść przez odniesienie

Po pierwsze, musisz zrozumieć, że sama zmienna „mylist” nie jest listą, ale odnosi się do listy o wartościach. Możesz nazwać zmienną „mylist” pojemnikiem o wartościach w nim wartości. Wartości listy są obiektami. Zmienna „mylist” została dostarczona prosto do funkcji z jej zawartością.

Zarówno „lista”, jak i „moja lista” wydają się być tą samą zmienną pamięci w przykładzie kodu poniżej, a zatem zastosują się do tego samego obiektu pamięci. Dlatego na wyjściu drukuje „saeed.'

Wszelkie działania na zmiennej lub jednostce zostałyby natychmiast odzwierciedlone do metody dzwoniącego. Metoda może całkowicie modyfikować wartość zmiennej i celować w całkowicie odrębny obiekt. Jak widać w funkcji „set_list”, zmieniliśmy zawartość listy i wydrukowaliśmy zupełnie nową listę mającą element AQSA.„Dzieje się tak, ponieważ zwróciliśmy zmodyfikowaną listę i wydrukowaliśmy ją w tym samym wierszu, co dzwoniący.

Metoda może również urzeczywistnić elementy zmiennej dla tego samego wyniku, co poniżej. Możesz zobaczyć, że dołączyliśmy nową wartość do listy, a zmiana została odzwierciedlona. Dołączyliśmy unikalny ciąg do listy i zwróciliśmy go do dzwoniącego. Podsumowując, metoda i dzwoniący używają tej samej zmiennej i obiektu w całej relacji podanie.

Przekazać wartość

Przez przełę wartość metoda jest dostarczana z duplikatem obiektu argumentu. Zapewnia to, że oryginalny element pozostaje niezmieniony, a wszystkie wykonane modyfikacje są zachowane w oddzielnych lokalizacjach pamięci w replice tego samego obiektu.

Jest równie ważny z wszelkimi operacją wykonywanymi na zmiennej lub jednostce metodą. Duplikaty zmiennych i obiektów w zakresie metody dzwoniącego są całkowicie oddzielone, aby.

Przejdź obiekt przez odniesienie

W tej sytuacji, ponieważ Python jest odrębny, metody Pythona uzyskują bardzo podobne odniesienie obiektów w pamięci, jak dzwoniący. I odwrotnie, technika nie uzyskuje zmiennej „myList” (pojemnik). Metoda dzwoniącego przechowuje ten sam obiekt; Metoda generuje pojemnik i generuje całkowicie świeży wskaźnik dla własnego.

Dzwoniący i metoda mówią o tym samym obiekcie w pamięci, ale gdy dołączona metoda stosuje element zewnętrzny do listy, jednostka dzwoniąca jest zmodyfikowana. Mają wiele etykiet, ale to te same rzeczy. Obie zmienne mają bardzo podobny obiekt. To jest poczucie, że jego związek z poruszaniem się przez obiekt. W magazynie metoda i dzwoniący używają podobnego obiektu, ale złapią je przez wiele zmiennych. Zmienna dzwoniąca (kontener) nie zostanie zmieniona na podstawie żadnych modyfikacji dokonanych na zmienną metody (kontener); Tylko dane lub treść są modyfikowane.

Wniosek

Python działa niezależnie od języków, które akceptują przeprowadzkę przez odniesienie lub wartość argumentów. Argumenty metody to zmienne lokalne, które zostały przydzielone do każdej wartości przeniesionej do metody. Ale to nadal nie wyklucza uzyskania tych samych wyników, które można znaleźć w innych językach podczas przenoszenia argumentów przez proxy.