Ohita viite vs. arvo Pythonissa

Pass Reference Vs



Pythonin tuntemisen jälkeen voit löytää tapauksia, joissa toiminnot eivät muuta argumentteja paikallaan odotetulla tavalla, varsinkin jos tunnet monia muita tietokoneen kieliä. Monet kielet käyttävät metodiargumentteja viitteinä, jotka määritellään ohitukseksi Viittaus nykyisiin muuttujiin. Jos olet kehittynyt Python -kehittäjä ja haluat ymmärtää Pythonin erityisen tavan käsitellä menetelmäargumentteja, tämä opas on todella sinua varten.

Python tukee objektikohtaista ohitusta

Ohitusviite ja ohitusarvo ovat kiistatta kaksi parhaiten tunnistettua ja helposti ymmärrettävää tapaa parametrien siirtämiseen ohjelmointikielien välillä. Valitettavasti Python on 'ohitusobjekti-viittaus', ei arvokulku tai ohitusviite, jota kutsutaan usein kutsukohtaiseksi viitteeksi ja puhelujakajaksi. On hyödyllistä tarkastella tarkemmin itse konseptia jakamalla se osiin, kun syventyt viittauksen ohituksen teknisiin erityispiirteisiin:







Kulkea: tämä tarkoittaa menetelmän toimittamista argumentilla.



Viittaamalla: tämä tarkoittaa sitä, että menetelmään siirtymäsi argumentti viittaa muuttujaan, joka on nyt tallennustilassa kyseisen muuttujan eri kopion sijasta.



Kun määrität menetelmälle viittauksen määritettyyn muuttujaan, kaikki tämän viitteen toiminnot vaikuttaisivat nimenomaisesti muuttujaan, jota se vastaa. Tarkastellaan nyt esimerkkiä siitä, miten tämä käytännössä toimii. Tässä esimerkissä olemme määrittäneet muuttujan ' vihainen' joiden arvo on 4 . Koko tämän skenaarion aikana muuttuja ' vihainen' ei muutettu sen tilalle. Python näyttää käsittelevän antamaasi argumenttia sen sijaan, että viittaisi nykyiseen muuttujaan itsenäisenä arvona.





Tarkoittaako tämä, että viittauksen sijasta Python siirtää argumentteja arvon mukaan? Python siirtää argumentteja määrityksen kautta, joten ei viitteen tai arvon perusteella. Tämän logiikka on kaksijakoinen:



Tällä hetkellä sisääntuleva parametri on osoitin kohteeseen. Tietyt tietotyypit ovat muuttuvia, ja jotkut eivät ole muutettavissa.

Jos siirrämme muuttuvan esineen funktioksi, funktio saa viittauksen samaan kohteeseen, jotta voit mutatoida kaiken sielusi tyydyttävällä tavalla; ulkoinen laajuus ei kuitenkaan tiedä mitään ennen kuin palaat funktion viittaukseen. Kun olet valmis, ulkoinen viite kohdistuu vain todelliseen kohteeseen. Jos siirrät muuttumattoman objektin funktioon, ulkoista viitettä ei aina voida yhdistää uudelleen, etkä voi vain mutatoida objektia. Jotta asiat olisivat paljon yksinkertaisempia, ymmärretään yksi kerrallaan.

Ohita viitteellä

Ensinnäkin sinun on ymmärrettävä, että muuttuja 'mylist' ei ole luettelo, vaan viittaa luetteloon, jolla on arvoja. Voit kutsua muuttujaa 'mylist' kontiksi, jossa on arvoja. Luettelon arvot ovat objekteja. Muuttuja ‘mylist’ on suoraan toimitettu funktioon sen sisällön kanssa.

Sekä lista että luetteloni näyttävät olevan sama tallennusmuuttuja alla olevassa koodiesimerkissä, joten ne koskevat samaa tallennusobjektia. Siksi tulostus tulostaa 'Saeedin'.

Kaikki muuttujalle tai entiteetille tehdyt toimet heijastuvat välittömästi soittajan menetelmään. Menetelmä voi muuttaa muuttujan arvoa kokonaan ja kohdistaa sen täysin erilliseen kohteeseen. Kuten toiminnosta 'set_list' näet, olemme muuttaneet luettelon sisältöä ja tulostaneet kokonaan uuden luettelon, jossa on elementti 'Aqsa'. Tämä johtuu siitä, että olemme palauttaneet muokatun luettelon ja tulostaneet sen samalla rivillä kuin soittaja.

Menetelmä voi myös kohdistaa muuttujan elementit uudelleen samaan tulokseen kuin alla. Näet, että olemme lisänneet luetteloon uuden arvon ja muutos on otettu huomioon. Olemme liittäneet luetteloon ainutlaatuisen merkkijonon ja palauttaneet sen soittajalle. Yhteenvetona voidaan todeta, että menetelmä ja soittaja ovat käyttäneet samaa muuttujaa ja objektia koko ohitussuhteen ajan.

Ohita arvo

Menetelmän mukana toimitetaan argumenttikohteen kaksoiskappale, jonka soittaja sille antaa. Tämä varmistaa, että alkuperäinen kohde pysyy muuttumattomana ja kaikki tehdyt muutokset säilytetään erillisissä muistipaikoissa saman objektin kopiossa.

Se pätee yhtä hyvin kaikkiin muuttujan tai kokonaisuuden menetelmillä suoritettuihin toimintoihin. Soittajan menetelmän soveltamisalan muuttujien ja objektien kopiot on erotettu kokonaan yhteenvetona.

Ohita kohde viitteellä

Koko tämän tilanteen aikana, koska Python on erilainen, Pythonin menetelmät saavat tallenteessa samanlaisen objektiviittauksen kuin soittaja. Toisaalta tekniikka ei saa muuttujaa 'mylist' (säilö). Soittajan menetelmä tallentaa saman objektin; menetelmä luo oman säiliönsä ja luo kokonaan tuoreen indeksin itselleen, aivan kuten ohitusarvo.

Soittaja ja menetelmä puhuvat samasta objektista tallennustilassa, mutta kun liitteenä oleva menetelmä käyttää ulkoista kohdetta luetteloon, soittajan entiteetti muuttuu. Niissä on useita tarroja, mutta ne ovat samat asiat. Molemmilla muuttujilla on hyvin samanlainen objekti. Se on tunne sen takana, kun se liittyy kohteen liikkumiseen. Tallennustilassa menetelmä ja soittaja käyttävät samanlaista objektia, mutta sieppaavat ne useiden muuttujien kautta. Soittajan muuttuja (kontti) ei muutu millään menetelmämuuttujaan (kontti) tehdyillä muutoksilla; vain tietoja tai sisältöä muutetaan.

Johtopäätös

Python toimii riippumattomasti kielistä, jotka hyväksyvät siirron viittauksen tai argumenttien arvon perusteella. Metodiargumentit ovat paikallisia muuttujia, jotka on allokoitu kullekin menetelmälle siirretylle arvolle. Mutta se ei silti estä sinua saamasta samoja tuloksia, joita saatat muilla kielillä, kun siirrät argumentteja välityspalvelimella.