Elhaladás referencia és érték között Pythonban

Pass Reference Vs



A Python ismerete után találhat olyan eseteket, amikor a függvények nem változtatják meg az érveket egy helyen, ahogy azt előre gondolná, különösen, ha sok más számítógépes nyelvet ismer. Sok nyelv metódus argumentumokat használ hivatkozásként, amelyet úgy definiálnak, hogy az aktuális változókra való hivatkozás. Ha Ön fejlett Python -fejlesztő, aki meg akarja érteni a Python módszer -érvek kezelésének sajátos módját, akkor ez az útmutató valóban az Ön számára készült.

A Python támogatja az objektumreferenciát

A programozási nyelvek között a paraméterek átvitelének kétségtelenül a leghíresebb és legkönnyebben érthető módja a pass-by-reference és a pass-by-value. Sajnos a Python „objektumonkénti hivatkozás”, sem érték szerinti átadás, sem utalás hivatkozásként, gyakran hívás objektumreferenciának, valamint hívás megosztásnak. Hasznos, ha alaposabban megvizsgálja magát a koncepciót, ha szegmensekre bontja, miközben belemerül a Referencia elhaladásának technikai sajátosságaiba:







Bérlet: ez egy metódus argumentummal való ellátását jelenti.



Referencia alapján: ez azt jelenti, hogy a metódusra áttérő érv egy olyan változóra vonatkozik, amely most a tárolóban található, a változó más replika helyett.



Amikor hozzárendel egy módszert a megadott változóhoz, akkor a referencia minden művelete kifejezetten befolyásolja a megfelelő változót. Most nézzünk egy példát arra, hogyan működik ez a gyakorlatban. Ebben a példában definiáltunk egy változót ' mérges' amelynek értéke 4 . Ebben a forgatókönyvben a „ mérges' nem módosították a helyén. Úgy tűnik, hogy a Python kezeli az Ön által megadott érvet, ahelyett, hogy önálló értékként hivatkozna a jelenlegi változóra.





Ez azt jelentené, hogy a hivatkozás helyett a Python érték szerint mozgatja az érveket? A Python az érveket a hozzárendelésen keresztül mozgatja, tehát sem hivatkozás, sem érték alapján. Ennek logikája kettős:



Jelenleg az átadott paraméter egy mutató egy objektumra. Bizonyos típusú adatok megváltoztathatók, néhány pedig nem.

Ha megváltoztatható tárgyat mozgatunk egy függvénybe, akkor a függvény hivatkozást kap ugyanarra az objektumra, így a lelke megelégedésére mindezt mutálhatja; a külső hatókör azonban semmit sem tud, mielőtt újra csatlakozik a függvényhez a hivatkozáshoz. Miután befejezte, a külső referencia csak a tényleges objektumra irányul. Ha megváltoztathatatlan objektumot helyez át egy függvénybe, a külső referencia mindig nem köthető újra, és nem csak mutálhatja az objektumot. Hogy a dolgok sokkal egyszerűbbek legyenek, értsük meg egyenként.

Pass by Reference

Először is meg kell értenie, hogy a „mylist” változó önmagában nem lista, hanem egy értékeket tartalmazó listára utal. A „mylist” változót olyan tárolónak nevezheti, amelynek értékei vannak. A listaértékek objektumok. A „mylist” változó tartalmával egyenesen a funkcióba került.

Mindkét lista és az én listám ugyanaz a tárolóváltozó, mint az alábbi kódpéldában, és ezért ugyanazokra a tárolási objektumokra vonatkoznak. Ezért a kimeneten a „Saeed” felirat jelenik meg.

A változón vagy entitáson végrehajtott bármely művelet azonnal tükröződik a hívó módszerben. A módszer teljesen módosíthatja a változó értékét, és egy teljesen elkülönülő objektumra irányíthatja. Amint az a „set_list” függvényben látható, megváltoztattuk a lista tartalmát, és egy teljesen új listát nyomtattunk ki, amely tartalmazza az „Aqsa” elemet. Ez azért van, mert visszaadtuk a módosított listát, és kinyomtattuk a hívóval azonos sorban.

A módszer a változó elemeit is áthelyezheti ugyanazon eredményre, mint az alábbiakban. Láthatja, hogy új értéket fűztünk a listához, és a változás tükröződött. Egy egyedi karakterláncot fűztünk a listához, és visszaadtuk a hívónak. Összefoglalva, a módszer és a hívó ugyanazt a változót és objektumot használta az áthaladási reláció során.

Érték mellett

Az áthaladás értéken keresztül a metódust az argumentumobjektum másolatával szállítjuk, amelyet a hívó hozzárendel. Ez biztosítja, hogy az eredeti elem változatlan marad, és az összes módosítás ugyanazon objektum másolatában, külön memóriahelyeken marad.

Ugyanilyen érvényes minden olyan műveletre, amelyet egy módszerrel végrehajtanak egy változón vagy entitáson. A hívó módszer hatókörében szereplő változók és objektumok ismétlődései teljesen elkülönülnek, hogy összefoglalhassák őket.

Objektum átadása hivatkozás alapján

Ebben a helyzetben, mivel a Python különbözik egymástól, a Python módszerei ugyanazt az objektumreferenciát kapják a tárolóban, mint a hívó. Ezzel szemben a technika nem kapja meg a „mylist” változót (a tároló). A hívó módszer ugyanazt az objektumot tárolja; a módszer generálja a tárolóedényt, és teljesen friss indexet generál a sajátjához, akárcsak az átmeneti érték.

A hívó és a módszer ugyanazon objektumról beszél a tárolóban, de amikor a mellékelt metódus külső elemet alkalmaz egy listára, a hívó entitás módosul. Több címkével rendelkeznek, de ugyanazok a dolgok. Mindkét változó nagyon hasonló objektumot tartalmaz. Ez az az érzés, ami a tárgy által történő mozgáshoz való viszonya mögött van. A tárolóban a módszer és a hívó hasonló objektumot használ, de több változón keresztül elkapja őket. A hívó változót (a tárolót) a metódus változó (a tároló) semmilyen módosítása nem fogja megváltoztatni; csak az adatok vagy a tartalom módosul.

Következtetés

A Python függetlenül működik azoktól a nyelvektől, amelyek elfogadják a hivatkozást vagy az érvek értékét. A metódus argumentumok helyi változók, amelyeket a módszerhez átvitt minden értékhez rendeltek. De ez még mindig nem zárja ki, hogy ugyanazokat az eredményeket érje el, amelyeket más nyelveken is talál, miközben az érveket proxy útján mozgatja.