Python tukee Pass by Object Reference -sovellusta
Pass-by-reference ja pass-by-value ovat kiistatta kaksi tunnetuinta ja helposti ymmärrettävää tapaa parametroida ohjelmointikielten välillä. Python on valitettavasti "pass-by-object-reference", ei "Pass by Value" eikä "Pass by Reference", usein nimitystä "Call by Object Reference" sekä "Call by Sharing"."On hyödyllistä tarkastella tarkemmin itse konseptia jakamalla se segmentteihin samalla kun syvennät viitteiden ohittamisen teknisiin yksityiskohtiin:
Kulkea: tämä tarkoittaa menetelmän toimittamista argumentilla.
Viittaamalla: tämä tarkoittaa sitä, että argumentti, jonka siirrät menetelmään, viittaa muuttujaan, joka nyt sijaitsee varastossa kyseisen muuttujan toisen kopion sijaan.
Kun määrität menetelmälle viitteen määriteltyyn muuttujaan, kaikki tämän viitteen toiminnot vaikuttavat 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 'arg ' joiden arvo on 4. Koko skenaariossa muuttuja 'arg ' ei muutettu sen tilalle. Python näyttää näyttävän käsittelevän antamaasi argumenttia viittauksen sijasta nykyiseen muuttujaan itsenäisenä arvona.
Tarkoittaako tämä, että Python siirtää viitteiden sijasta argumentteja arvon mukaan? Python siirtää argumentit tehtävän kautta, joten ei viitteellä eikä arvolla. Tämän logiikka on kaksinkertainen:
Tällä hetkellä sisään menevä parametri on osoitin objektille. Tietyntyyppiset tiedot ovat muutettavissa, ja jotkut eivät ole muutettavissa.
Jos siirrämme muutettavan objektin funktioksi, funktio saa viitteen samaan esineeseen, jotta voit mutatoida kaiken sielusi tyydyttävällä tavalla; ulkoinen laajuus ei kuitenkaan tiedä mitään, ennen kuin liityt viitteeseen uudelleen toiminnossa. Kun olet valmis, ulkoinen viite kohdistuu vain varsinaiseen kohteeseen. Jos siirrät muuttumattoman objektin funktioon, ulkoista viitettä ei aina voida liittää uudelleen, etkä voi vain mutatoida objektia. Jotta asiat olisivat paljon yksinkertaisempia, ymmärretään yksitellen.
Ohita viite
Ensinnäkin sinun on ymmärrettävä, että muuttuja 'mylist' itsessään ei ole luettelo, vaan viittaa luetteloon, jolla on arvot. Voit kutsua muuttujaa "mylist" säilöksi, jolla on arvot. Luettelon arvot ovat objekteja. Muuttuja 'mylist' on toimitettu suoraan funktioon sen sisällön kanssa.
Molemmat “list” ja “my list” näyttävät olevan sama tallennusmuuttuja alla olevasta koodiesimerkistä ja soveltuvat siten samaan tallennusobjektiin. Siksi se tulostaa Saeed.'
Kaikki muuttujalle tai entiteettiin tehdyt toiminnot peilataan välittömästi soittajan menetelmään. Menetelmä voi täysin muuttaa muuttujan arvoa ja kohdistaa sen täysin erilliseen kohteeseen. Kuten funktiosta '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. Voit nähdä, 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 ohikulkusuhteen ajan.
Ohita arvo
Läpäisyn arvon kautta menetelmä toimitetaan kopio argumenttiobjektista, jonka soittaja sille antaa. Tämä varmistaa, että alkuperäinen kohde säilyy muuttumattomana ja kaikki tehdyt muutokset säilytetään erillisissä muistipaikoissa saman objektin kopiossa.
Se on yhtä pätevä kaikkien muuttujalle tai kokonaisuuteen menetelmän avulla suoritettujen toimintojen kanssa. Soittajan menetelmän piirissä olevien muuttujien ja objektien kopiot erotetaan kokonaan niiden yhteenvedon muodostamiseksi.
Ohita objekti viitteellä
Koska Python on erillinen, koko tässä tilanteessa Pythonin menetelmät saavat muistissa olevan samanlaisen objektiviitteen kuin soittaja viittaa. Toisaalta tekniikka ei saa muuttujaa 'mylist' (kontti). Soittajamenetelmä tallentaa saman objektin; menetelmä luo oman säiliön ja luo kokonaan uuden indeksin omalleen, aivan kuten ohitusarvossa.
Soittaja ja menetelmä puhuvat samasta objektista tallennustilassa, mutta kun liitetty menetelmä soveltaa ulkoista kohdetta luetteloon, soittajaentiteettiä muokataan. Heillä on useita tarroja, mutta ne ovat samat asiat. Molemmilla muuttujilla on hyvin samanlainen kohde. Se on takana sen suhde kohteen liikkumiseen. Varastossa menetelmä ja soittaja käyttävät samanlaista objektia, mutta saavat ne kiinni useiden muuttujien kautta. Soittajan muuttujaa (säilö) ei muuteta metodimuuttujaan (säilö) tehdyillä muutoksilla; vain tietoja tai sisältöä muokataan.
Johtopäätös
Python toimii itsenäisesti kielistä, jotka hyväksyvät siirron viitteellä tai argumenttien arvolla. Metodiargumentit ovat paikallisia muuttujia, jotka on allokoitu kullekin menetelmään siirretylle arvolle. Mutta se ei silti estä sinua saamasta samoja tuloksia kuin muillakin kielillä samalla kun siirrät argumentteja välityspalvelimen avulla.