Piton

Treceți de referință vs. Valoare în Python

Treceți de referință vs. Valoare în Python
După ce cunoașteți Python, puteți găsi cazuri în care funcțiile nu modifică argumentele într-un loc așa cum ați anticipa, mai ales dacă sunteți familiarizat cu multe alte limbi de computer. Multe limbi folosesc argumentele metodei ca referințe, definite ca trecând prin Referință la variabilele curente. Dacă sunteți un dezvoltator Python avansat, care dorește să înțeleagă modul particular al Python de a trata argumentele metodei, atunci acest ghid este cu adevărat pentru dvs.

Python acceptă referințe trecere prin obiect

Pass-by-reference și pass-by-value sunt incontestabil cele două modalități cele mai bine recunoscute și ușor de înțeles de a trece parametrii între limbaje de programare. Python nu este, din păcate, „trecere prin obiect-referință”, nici „Trecere după valoare”, nici „Trecere prin referință”, denumită adesea „Referință apel prin obiect”, precum și „Apelare prin partajare”.”Este util să priviți mai atent conceptul în sine împărțindu-l în segmente în timp ce vă aruncați în specificul tehnic al trecerii prin Referință:

Trece: aceasta înseamnă furnizarea unei metode cu un argument.

De referință: acest lucru înseamnă că argumentul pe care îl treceți la metodă se referă la o variabilă care se află acum în stocare în loc de o replică diferită a acelei variabile.

Pe măsură ce atribuiți metodei o referință la o variabilă definită, variabila căreia îi corespunde ar fi influențată în mod explicit de toate operațiunile din această Referință. Acum, să luăm în considerare un exemplu al modului în care, în practică, funcționează acest lucru. În acest exemplu, am definit o variabilă „arg ' având o valoare de 4. În tot acest scenariu, variabila „arg ' nu a fost modificat în locul său. Python pare să gestioneze argumentul furnizat în locul unei referințe la o variabilă prezentă ca valoare autonomă.

Ar însemna asta că, în loc de Referință, Python mută argumentele după valoare? Python mută argumentele prin atribuire, deci nici prin Referință, nici cu valoare. Logica pentru aceasta este dublă:

În prezent, parametrul care trece este un indicator către un obiect. Anumite tipuri de date pot fi modificate, iar altele nu pot fi modificate.

Dacă mutăm un obiect mutabil într-o funcție, funcția capătă o referință la același obiect, astfel încât să puteți muta totul pentru satisfacția sufletului vostru; cu toate acestea, domeniul de aplicare extern nu ar ști nimic înainte de a vă alătura din nou referinței în funcție. După ce ați terminat, Referința externă va viza doar obiectul real. Dacă mutați un obiect imuabil într-o funcție, referința externă nu poate fi întotdeauna legată din nou și nu puteți muta doar obiectul. Pentru a face lucrurile mult mai simple, să înțelegem unul câte unul.

Treceți prin referință

În primul rând, trebuie să înțelegeți că variabila „lista mea” în sine nu este o listă, ci se referă la o listă cu valori. Puteți numi variabila „lista mea” unui container cu valori în interiorul acestuia. Valorile listei sunt obiecte. Variabila „lista mea” a fost livrată direct în funcție cu conținutul său.

Atât „listă”, cât și „lista mea” par a fi aceeași variabilă de stocare în exemplul de cod de mai jos și se aplică astfel aceluiași obiect de stocare. De aceea, la ieșire, imprimă 'Saeed.'

Orice acțiune efectuată asupra variabilei sau entității va fi imediat reflectată în metoda apelantului. Metoda poate modifica în totalitate valoarea variabilei și o poate viza pe un obiect complet distinct. După cum puteți vedea în funcția „set_list”, am modificat conținutul listei și am imprimat o listă complet nouă cu elementul „Aqsa.„Acest lucru se datorează faptului că am returnat lista modificată și am imprimat-o pe aceeași linie cu apelantul.

De asemenea, metoda poate realoca elementele variabilei pentru același rezultat ca mai jos. Puteți vedea că am adăugat o nouă valoare la listă, iar schimbarea a fost reflectată. Am adăugat un șir unic la o listă și l-am returnat apelantului. În concluzie, metoda și apelantul au folosit aceeași variabilă și obiect pe parcursul relației de trecere.

Treceți după valoare

Prin trecere prin valoare, metoda este furnizată cu un duplicat al obiectului argument pe care apelantul îi atribuie. Acest lucru asigură faptul că elementul original rămâne neschimbat și toate modificările aduse sunt păstrate în locații de memorie separate într-o replică a aceluiași obiect.

Este valabil la fel cu orice operații executate pe o variabilă sau entitate prin metodă. Duplicatele variabilelor și obiectelor din sfera metodei apelantului sunt complet separate pentru a le rezuma.

Treceți obiectul prin referință

De-a lungul acestei situații, deoarece Python este distinct, metodele Python obțin o referință de obiect foarte similară în stocare, așa cum se referă apelantul. În schimb, tehnica nu obține variabila „lista mea” (containerul). Metoda apelantului stochează același obiect; metoda generează containerul propriu și generează un indice complet nou pentru propriul său, la fel ca în valoare de trecere.

Apelantul și metoda vorbesc despre același obiect în spațiul de stocare, dar atunci când metoda anexată aplică un element extern unei liste, entitatea apelantului este modificată. Au mai multe etichete, dar sunt aceleași lucruri. Ambele variabile dețin un obiect foarte similar. Acesta este sensul din spatele relației sale cu mișcarea de obiect. În spațiul de stocare, metoda și apelantul folosesc un obiect similar, dar le captează prin mai multe variabile. Variabila apelant (containerul) nu va fi modificată prin modificări aduse variabilei metodei (containerul); doar datele sau conținutul sunt modificate.

Concluzie

Python funcționează independent de limbile care acceptă mutarea prin Referință sau valoarea argumentelor. Argumentele metodei sunt variabile locale care au fost alocate fiecărei valori transferate metodei. Dar asta încă nu vă împiedică să obțineți aceleași rezultate pe care le-ați găsi în alte limbi în timp ce mutați argumentele prin proxy.

Cum se folosește GameConqueror Cheat Engine în Linux
Articolul acoperă un ghid despre utilizarea sistemului de înșelăciune GameConqueror în Linux. Mulți utilizatori care joacă jocuri pe Windows folosesc ...
Cele mai bune emulatoare pentru console de jocuri pentru Linux
Acest articol va enumera programele populare de emulare a consolei de jocuri disponibile pentru Linux. Emularea este un strat de compatibilitate softw...
Best Linux Distros for Gaming in 2021
The Linux operating system has come a long way from its original, simple, server-based look. This OS has immensely improved in recent years and has no...