Passa per referència vs. valor a Python

Pass Reference Vs



Després de conèixer Python, podeu trobar casos en què les funcions no modifiquen els arguments en un lloc com es preveuria, sobretot si coneixeu molts altres llenguatges informàtics. Molts llenguatges utilitzen arguments de mètode com a referències, definits com passar per Referència a variables actuals. Si sou un desenvolupador avançat de Python que vol copsar la forma particular de Python de tractar els arguments del mètode, aquesta guia us convé.

Python admet la referència Pass by Object

Pass-by-reference i pass-by-value són innegablement les dues maneres més ben reconegudes i fàcilment comprensibles de passar paràmetres entre llenguatges de programació. Lamentablement, Python no és 'passar-per-objecte-referència', ni passar per valor ni passar per referència, sovint denominat com a referència de trucada per objecte, així com de trucada per compartir. És útil mirar més de prop el concepte dividint-lo en segments mentre us submergiu en els detalls tècnics de passar per referència:







Passar: això significa subministrar un mètode amb un argument.



Per referència: això significa que l'argument que passeu al mètode fa referència a una variable que ara resideix a l'emmagatzematge en lloc d'una rèplica diferent d'aquesta variable.



A mesura que assigneu al mètode una referència a una variable definida, la variable a la qual correspon estaria influïda explícitament per totes les operacions d'aquesta referència. Vegem ara un exemple de com, a la pràctica, funciona això. En aquest exemple, hem definit una variable ' enfadat ' amb un valor de 4 . En tot aquest escenari, la variable ' enfadat ' no es va modificar al seu lloc. Sembla que Python gestiona el vostre argument proporcionat en lloc de fer referència a una variable actual com a valor autònom.





Vol dir això que, en lloc de fer-ho per referència, Python mou els arguments per valor? Python mou arguments mitjançant l'assignació, de manera que ni per referència ni per valor. La lògica d'això és doble:



Actualment, el paràmetre que passa és un punter cap a un objecte. Alguns tipus de dades són mutables i d’altres no.

Si traslladem un objecte mutable a una funció, la funció adquireix una referència al mateix objecte perquè pugueu mutar-lo tot per a la satisfacció de la vostra ànima; tanmateix, l'abast extern no sabria res abans de tornar a unir-vos a la referència a la funció. Un cop hàgiu acabat, la referència externa només apuntarà a l'objecte real. Si moveu un objecte immutable a una funció, la referència externa no sempre es pot tornar a enllaçar i no només podeu mutar l’objecte. Per fer les coses molt més senzilles, entenguem-les una per una.

Passar per referència

En primer lloc, heu d’entendre que la variable ‘mylist’ en si no és una llista, sinó que fa referència a una llista que té valors. Podeu anomenar la variable 'la meva llista' a un contenidor que conté valors. Els valors de la llista són objectes. La variable ‘mylist’ s’ha lliurat directament a la funció amb el seu contingut.

Tant la llista com la meva llista semblen ser la mateixa variable d'emmagatzematge a l'exemple de codi següent i, per tant, s'apliquen al mateix objecte d'emmagatzematge. Per això, a la sortida, imprimeix 'Saeed'.

Qualsevol acció feta sobre la variable o l'entitat es reflectiria immediatament al mètode de la persona que truca. El mètode pot modificar completament el valor de la variable i apuntar-lo cap a un objecte completament diferent. Com podeu veure a la funció 'set_list', hem canviat el contingut de la llista i hem imprès una llista completament nova amb l'element 'Aqsa'. Això es deu al fet que hem retornat la llista modificada i la hem imprès a la mateixa línia que la persona que truca.

El mètode també pot reassignar els elements de la variable per obtenir el mateix resultat que a continuació. Podeu veure que hem afegit un valor nou a la llista i el canvi s’ha reflectit. Hem afegit una cadena única a una llista i l’hem retornat a la persona que truca. Per concloure, el mètode i la persona que truca han estat utilitzant la mateixa variable i objecte al llarg de la relació pass-by.

Passa per valor

Mitjançant pass per valor, el mètode es subministra amb un duplicat de l’objecte argument que l’assignant li assigna. Això garanteix que l'element original es mantingui sense canvis i que totes les modificacions realitzades es conservin en ubicacions de memòria separades en una rèplica del mateix objecte.

És igualment vàlid amb qualsevol operació executada en una variable o en l’entitat pel mètode. Els duplicats de variables i objectes de l'abast del mètode de trucada estan completament separats per resumir-los.

Passar objecte per referència

Al llarg d’aquesta situació, atès que Python és diferent, els mètodes de Python obtenen la referència d’objecte molt similar a l’emmagatzematge a la que fa referència la persona que truca. Per contra, la tècnica no obté la variable 'la meva llista' (el contenidor). El mètode de la persona que truca emmagatzema el mateix objecte; el mètode genera el contenidor i genera un índex completament nou per al seu compte, tal com passa per valor.

La persona que truca i el mètode parlen del mateix objecte a l'emmagatzematge, però quan el mètode afegit aplica un element extern a una llista, l'entitat de la persona que truca es modifica. Tenen diverses etiquetes, però són les mateixes coses. Les dues variables tenen un objecte molt similar. Aquest és el sentit de darrere de la seva relació amb el moviment de l’objecte. A l’emmagatzematge, el mètode i la persona que truca utilitzen un objecte similar però els capturen a través de diverses variables. La variable de la persona que truca (el contenidor) no es modificarà per cap modificació que es faci a la variable del mètode (el contenidor); només es modifiquen les dades o el contingut.

Conclusió

Python funciona independentment dels idiomes que accepten el desplaçament per referència o el valor dels arguments. Els arguments del mètode són variables locals que s’han assignat a cada valor transferit al mètode. Però això encara no impedeix obtenir els mateixos resultats que trobareu en altres idiomes mentre es mouen els arguments per servidor intermediari.