Mööduge viitest vs väärtusest Pythonis

Pass Reference Vs



Pärast Pythoni tundmist võite leida juhtumeid, kus funktsioonid ei muuda argumente kohapeal, nagu võiksite oodata, eriti kui olete tuttav paljude teiste arvutikeeltega. Paljud keeled kasutavad viitena meetodi argumente, mis on määratletud kui läbimine Viide praegustele muutujatele. Kui olete arenenud Pythoni arendaja, kes soovib mõista Pythoni konkreetset viisi meetodiargumentide käsitlemiseks, on see juhend tõesti teie jaoks.

Python toetab objekti viiteid

Läbiviide ja mööduv väärtus on vaieldamatult kaks kõige paremini tunnustatud ja hõlpsasti mõistetavat meetodit programmeerimiskeelte vahel parameetrite edastamiseks. Kahjuks on Python „objekti-viide”, ei väärtuse läbimine ega viide, sageli nimetatakse seda nii kõneobjekti viitena kui ka jagamise teel. Kasulik on kontseptsiooni ennast lähemalt uurida, jagades selle segmentideks, kui uurite viite läbimise tehnilisi eripärasid:







Üle andma: see tähendab meetodi esitamist argumendiga.



Viite järgi: see tähendab, et meetodile üleviidav argument viitab muutujale, mis asub nüüd selle muutuja erineva koopia asemel mälus.



Kui määrate meetodile viite määratletud muutujale, mõjutavad selle viite toimingud selgesõnaliselt muutujat, millele see vastab. Nüüd kaalume näidet selle kohta, kuidas see praktikas toimib. Selles näites oleme määratlenud muutuja ' vihane' mille väärtus on 4 . Selle stsenaariumi jooksul muutuja „ vihane' selle asemel ei muudetud. Tundub, et Python käsitleb teie esitatud argumenti selle asemel, et viidata praegusele muutujale kui iseseisvale väärtusele.





Kas see tähendaks, et viite asemel liigutab Python argumente väärtuse järgi? Python liigutab argumente määramise kaudu, seega ei viite ega väärtusega. Selle loogika on kahepoolne:



Praegu on sisenev parameeter kursor objektile. Teatud tüüpi andmed on muutlikud ja mõned mitte.

Kui teisaldame muutuva objekti funktsiooniks, omandab funktsioon viite samale objektile, et saaksite seda kõike oma hinge rahuldavalt muteerida; välimine ulatus ei teaks aga midagi enne funktsiooni viitega uuesti liitumist. Kui olete lõpetanud, suunab väline viide ainult tegelikku objekti. Kui teisaldate muutumatu objekti funktsioonile, ei saa välist viidet alati uuesti siduda ja te ei saa objekti lihtsalt muteerida. Asjade palju lihtsamaks muutmiseks mõistame ükshaaval.

Viide

Kõigepealt peate mõistma, et muutuja „mylist” ise ei ole loend, vaid viitab väärtustega loendile. Muutujat „mylist” saate nimetada konteineriks, millel on väärtused. Loendi väärtused on objektid. Muutuja „minu nimekiri” on selle sisuga funktsiooni otse lisatud.

Mõlemad loend ja minu loend näivad olevat alltoodud koodinäites sama salvestusmuutuja ja kehtivad seega sama salvestusobjekti kohta. Seetõttu prindib see väljundile „Saeed”.

Kõik muutuja või olemiga tehtud toimingud peegeldatakse kohe helistaja meetodile. Meetod võib muutuja väärtust täielikult muuta ja suunata selle täiesti erinevale objektile. Nagu näete funktsioonist „set_list”, oleme loendi sisu muutnud ja prindinud välja täiesti uue loendi, millel on element „Aqsa”. Seda seetõttu, et oleme tagastanud muudetud loendi ja printinud selle helistajaga samale reale.

Meetod võib ka muutuja elemente ümber jaotada sama tulemuse jaoks nagu allpool. Näete, et oleme loendile lisanud uue väärtuse ja muudatus on kajastatud. Oleme loendisse lisanud unikaalse stringi ja tagastanud selle helistajale. Kokkuvõtteks võib öelda, et meetod ja helistaja on läbisõidu ajal kasutanud sama muutujat ja objekti.

Väärtusest mööda

Läbiväärtuse kaudu antakse meetodile argumendi objekti duplikaat, mille helistaja talle määrab. See tagab, et algne element jääb muutumatuks ja kõik tehtud muudatused säilitatakse sama objekti koopia eraldi mälupaikades.

See kehtib võrdselt kõigi muutujaga või olemiga selle meetodi abil sooritatud toimingute kohta. Helistaja meetodi ulatuses olevate muutujate ja objektide duplikaadid on nende kokkuvõtteks täielikult eraldatud.

Objekti läbimine viite järgi

Kuna selles olukorras on Python erinev, saavad Pythoni meetodid salvestuses väga sarnase objekti viite, millele helistaja viitab. Vastupidi, tehnika ei saa muutujat „mylist” (konteiner). Helistaja meetod salvestab sama objekti; meetod genereerib oma konteineri ja genereerib enda jaoks täiesti värske indeksi, nagu ka möödaminnes.

Helistaja ja meetod räägivad samast objektist salvestusruumis, kuid kui lisatud meetod rakendab loendile välise üksuse, muudetakse helistaja olemit. Neil on mitu silti, kuid need on samad asjad. Mõlemad muutujad sisaldavad väga sarnast objekti. See on tagamõte, mis on seotud objekti liikumisega. Salvestusruumis kasutavad meetod ja helistaja sarnast objekti, kuid püüavad need läbi mitme muutuja. Helistaja muutuja (konteiner) ei muutu meetodimuutuja (konteineri) muudatustega; muudetakse ainult andmeid või sisu.

Järeldus

Python töötab sõltumatult keeltest, mis aktsepteerivad viitamist või argumentide väärtust. Meetodi argumendid on kohalikud muutujad, mis on eraldatud igale meetodile ülekantud väärtusele. Kuid see ei takista teil siiski saada samu tulemusi, mida võiksite leida teistes keeltes, samal ajal kui argumente volikirja alusel liigutada.