Pyton

Przekaż przez odniesienie vs. Wartość w Pythonie

Przekaż przez odniesienie vs. Wartość w Pythonie
Znając Pythona, możesz znaleźć przypadki, w których funkcje nie zmieniają argumentów w miejscu, jak można by się spodziewać, szczególnie jeśli znasz wiele innych języków komputerowych. Wiele języków używa argumentów metody jako referencji, definiowanych jako przekazywanie przez referencję do bieżących zmiennych. Jeśli jesteś zaawansowanym programistą Pythona, który chce poznać szczególny sposób traktowania argumentów metod w Pythonie, ten przewodnik jest naprawdę dla Ciebie.

Python obsługuje przekazywanie przez odniesienie do obiektu

Pass-by-reference i pass-by-value to niezaprzeczalnie dwa najbardziej rozpoznawalne i łatwo zrozumiałe sposoby przekazywania parametrów między językami programowania. Niestety, Python nie jest „przekaż przez odniesienie do obiektu”, ani „przekaż przez wartość”, ani „przekaż przez odniesienie”, często określany jako „Call by Object Reference” lub „Call by Sharing”.” Warto dokładniej przyjrzeć się samej koncepcji, dzieląc ją na segmenty, jednocześnie zagłębiając się w techniczne szczegóły przechodzenia przez Referencje:

Przechodzić: oznacza to dostarczenie metody z argumentem.

Według odniesienia: oznacza to, że argument, który przenosisz do metody, odnosi się do zmiennej, która teraz znajduje się w pamięci zamiast innej repliki tej zmiennej.

Gdy przypiszesz metodzie referencję do zdefiniowanej zmiennej, na zmienną, której ona odpowiada, będą miały wyraźny wpływ wszystkie operacje na tej referencji. Rozważmy teraz przykład, jak to działa w praktyce. W tym przykładzie zdefiniowaliśmy zmienną 'argumentować o wartości 4. W tym scenariuszu zmienna 'argumentować nie został zmodyfikowany na swoim miejscu. Wydaje się, że Python obsługuje podany przez Ciebie argument zamiast referencji do obecnej zmiennej jako samodzielnej wartości.

Czy oznaczałoby to, że zamiast przez Reference Python przenosi argumenty według wartości?? Python przenosi argumenty przez przypisanie, więc ani przez Reference, ani przez value. Logika tego jest dwojaka:

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

Jeśli przeniesiemy zmienny obiekt do funkcji, funkcja uzyskuje odniesienie do tego samego obiektu, dzięki czemu możesz zmutować to wszystko ku zadowoleniu swojej duszy; jednak zakres zewnętrzny nie będzie wiedział nic przed ponownym dołączeniem do Reference w funkcji. Gdy skończysz, zewnętrzne Odniesienie będzie wycelowane tylko w rzeczywisty obiekt. Jeśli przeniesiesz niezmienny obiekt do funkcji, zewnętrzne Odniesienie zawsze nie może zostać ponownie połączone i nie możesz po prostu zmutować obiektu. Aby wszystko było prostsze, zrozummy jeden po drugim.

Przekaż przez odniesienie

Przede wszystkim musisz zrozumieć, że sama zmienna 'mylist' nie jest listą, ale odnosi się do listy zawierającej wartości. Możesz nazwać zmienną „mylist” kontenerem zawierającym wartości. Wartości listy są obiektami. Zmienna 'mylist' została bezpośrednio dostarczona do funkcji wraz z jej zawartością.

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

Każda akcja wykonana na zmiennej lub jednostce zostanie natychmiast odzwierciedlona w metodzie wywołującej. Metoda może całkowicie zmodyfikować wartość zmiennej i skierować ją na całkowicie odrębny obiekt. Jak widać w funkcji 'set_list' zmieniliśmy zawartość listy i wydrukowaliśmy zupełnie nową listę zawierającą element 'Aqsa.' Dzieje się tak, ponieważ zwróciliśmy zmodyfikowaną listę i wydrukowaliśmy ją w tym samym wierszu co rozmówca.

Metoda może również realokować elementy zmiennej dla tego samego wyniku jak poniżej. Jak widzisz, dodaliśmy do listy nową wartość, a zmiana została uwzględniona. Dodaliśmy unikalny ciąg do listy i zwróciliśmy go rozmówcy. Podsumowując, metoda i obiekt wywołujący używały tej samej zmiennej i obiektu w całej relacji tranzytowej.

Przekaż przez wartość

Poprzez przekazywanie przez wartość, metoda jest dostarczana z duplikatem obiektu argumentu, który przypisuje mu wywołujący. Gwarantuje to, że oryginalny przedmiot pozostaje niezmieniony, a wszystkie dokonane modyfikacje są zachowywane w oddzielnych lokalizacjach pamięci w replice tego samego obiektu.

Jest to równie ważne w przypadku wszelkich operacji wykonywanych na zmiennej lub jednostce metodą. Duplikaty zmiennych i obiektów w zakresie metody wywołującej są całkowicie oddzielone, aby je podsumować.

Przekaż obiekt przez odniesienie

W całej tej sytuacji, ponieważ Python jest inny, metody Pythona uzyskują bardzo podobne odniesienie do obiektu w pamięci, do której odnosi się osoba wywołująca. I odwrotnie, technika nie uzyskuje zmiennej „mylist” (kontenera). Metoda wywołująca przechowuje ten sam obiekt; metoda generuje swój kontener i generuje całkowicie świeży indeks dla siebie, tak jak w przypadku wartości przekazywanej.

Wywołujący i metoda mówią o tym samym obiekcie w pamięci, ale gdy dołączona metoda stosuje element zewnętrzny do listy, encja wywołująca jest modyfikowana. Mają wiele etykiet, ale to te same rzeczy. Obie zmienne mają bardzo podobny przedmiot. Na tym polega sens związany z poruszaniem się obiektu. W pamięci metoda i wywołujący używają podobnego obiektu, ale przechwytują je przez wiele zmiennych. Zmienna wywołująca (kontener) nie zostanie zmieniona przez żadne modyfikacje wprowadzone w zmiennej metody (kontener); modyfikowane są tylko dane lub treść.

Wniosek

Python działa niezależnie od języków akceptujących przenoszenie według referencji lub wartości argumentów. Argumenty metody są zmiennymi lokalnymi, które zostały przydzielone do każdej wartości przekazanej do metody. Ale to nadal nie wyklucza możliwości uzyskania takich samych wyników, jakie można znaleźć w innych językach podczas przenoszenia argumentów przez proxy.

Gry 5 najlepszych gier zręcznościowych dla systemu Linux
5 najlepszych gier zręcznościowych dla systemu Linux
W dzisiejszych czasach komputery to poważne maszyny używane do gier. Jeśli nie możesz uzyskać nowego wysokiego wyniku, będziesz wiedział, o co mi chod...
Gry Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 wydana w zeszłym miesiącu jest szóstą wersją rozwojową w 1.13.Seria x i zapewnia szereg ulepszeń, w szczególności w interfejsie...
Gry Jak zainstalować League Of Legends na Ubuntu 14.04
Jak zainstalować League Of Legends na Ubuntu 14.04
Jeśli jesteś fanem League of Legends, to jest okazja do przetestowania League of Legends. Pamiętaj, że LOL jest obsługiwany w PlayOnLinux, jeśli jeste...