Kintamųjų perdavimo supratimas „Python“: nuoroda ir reikšmė

Python

Įvadas: Python kintamųjų perdavimo tyrinėjimas

„Python“ kintamųjų perdavimo funkcijoms būdas kartais gali būti painus, ypač kai bandoma suprasti „pereinamosios nuorodos“ ir „pasiekančios reikšmės“ sąvokas. Ši painiava dažnai išryškinama scenarijuose, kai kūrėjai tikisi, kad funkcijos kintamojo pakeitimai atsispindės ir už funkcijos ribų.

Norėdami tai iliustruoti, apsvarstykite klasę, kurioje kintamasis yra modifikuojamas metodo viduje. Tikėtinas rezultatas ne visada gali sutapti su tikruoju rezultatu dėl to, kaip Python tvarko kintamųjų perdavimą. Šiame straipsnyje gilinamasi į šio elgesio mechaniką ir pateikiama įžvalgų, kaip pasiekti „Python“ nuorodos efektus.

komandą apibūdinimas
self.variable = ['Original'] Inicijuoja keičiamą sąrašą su vienu eilutės elementu.
var[0] = 'Changed' Keičia pirmąjį metodui perduoto sąrašo elementą.
class Wrapper: Apibrėžia klasę, skirtą vertei apibendrinti, leidžiančią veikti, panašią į praeinamąją nuorodą.
self.value = value Inicijuoja įvyniojimo vertę Wrapper klasėje.
var.value = 'Changed' Pakeičia metodui perduoto Wrapper egzemplioriaus vertės atributą.
self.variable = {'key': 'Original'} Inicijuoja kintamą žodyną su viena rakto-reikšmių pora.
var['key'] = 'Changed' Keičia reikšmę, susietą su metodui perduotu žodyne esančiu raktu.

„Pass-by-Reference“ diegimas „Python“.

Pirmasis scenarijus naudoja kintamą sąrašą, kad pasiektų „Python“ nuorodos efektą. Klasėje , kintamasis inicijuojamas kaip sąrašas, kuriame yra vienas eilutės elementas „Original“. Metodas iškviečiamas, perduodant šį sąrašą metodui. Metodo viduje komanda var[0] = 'Changed' pakeičia pirmąjį sąrašo elementą. Kadangi sąrašai yra keičiami, šis pakeitimas atsispindi už metodo ribų, todėl gaunama išvestis „Pakeista“. Šis scenarijus parodo, kaip naudojant kintamus tipus, pvz., sąrašus, galima imituoti praėjimo pro nuorodą elgesį.

Antrasis scenarijus pristato a klasę, kad būtų įtraukta vertė, leidžianti naudoti nuorodas panašias funkcijas. Viduje klasė, kintamasis inicijuojamas egzemplioriumi Wrapper kuriame yra „Original“. Metodas yra vadinamas, pravažiuojant instancija. Metodo viduje komanda modifikuoja value atributas instancija. Šis pakeitimas atsispindi už metodo ribų, todėl gaunama išvestis „Pakeista“. Šis metodas parodo, kaip sukūrus tinkintą įvyniojimo klasę galima pasiekti panašių efektų, kaip ir naudojant nuorodą.

Žodynų naudojimas keičiant būseną

Trečiasis scenarijus naudoja žodyną, kad pasiektų nuorodos efektą. Viduje klasė, kintamasis inicijuojamas kaip žodynas su viena rakto-reikšmių pora {'key': 'Original'}. Metodas vadinamas, perduodant šį žodyną metodui. Metodo viduje komanda var['key'] = 'Changed' pakeičia reikšmę, susietą su raktu žodyne. Kadangi žodynai yra kintami, šis pakeitimas atsispindi už metodo ribų, todėl gaunama išvestis „Pakeista“. Šis scenarijus pabrėžia, kaip naudojant kintamus tipus, pvz., žodynus, galima imituoti praėjimo pro nuorodą elgesį.

Apskritai šie pavyzdžiai iliustruoja skirtingus metodus, kaip imituoti „Python“ nuorodas. Naudojant kintamus tipus, tokius kaip sąrašai ir žodynai, arba įdiegus pasirinktinę įvyniojimo klasę, galima pasiekti norimą efektą, kai funkcijos kintamojo pakeitimai atsispindi už funkcijos ribų. Šių metodų supratimas yra labai svarbus kūrėjams, norintiems efektyviau manipuliuoti kintamaisiais savo Python programose.

Objekto atributo keitimas, kad būtų galima imituoti nuorodą

Python: kintamų tipų naudojimas norint imituoti praeinamąją nuorodą

class PassByReference:
    def __init__(self):
        self.variable = ['Original']
        self.change(self.variable)
        print(self.variable[0])

    def change(self, var):
        var[0] = 'Changed'

pbr = PassByReference()

Įvyniojimo klasės naudojimas norint pasiekti einamosios nuorodos efektą

Python: Keičiamos būsenos įvyniojimo klasės įdiegimas

class Wrapper:
    def __init__(self, value):
        self.value = value

class PassByReference:
    def __init__(self):
        self.variable = Wrapper('Original')
        self.change(self.variable)
        print(self.variable.value)

    def change(self, var):
        var.value = 'Changed'

pbr = PassByReference()

Žodyno perdavimas, norint imituoti pravažiavimą

Python: žodynų naudojimas keičiamam būsenos perdavimui

class PassByReference:
    def __init__(self):
        self.variable = {'key': 'Original'}
        self.change(self.variable)
        print(self.variable['key'])

    def change(self, var):
        var['key'] = 'Changed'

pbr = PassByReference()

Python kintamųjų tvarkymo mechanizmų supratimas

„Python“ kintamųjų perdavimo sąvoka gali būti sudėtinga, ypač kai skiriami kintami ir nekintami objektai. Keičiami objektai, pvz., sąrašai ir žodynai, gali būti pakeisti vietoje, o tai reiškia, kad jei funkcijai perduodate kintamą objektą, bet kokie funkcijoje atlikti pakeitimai paveiks originalų objektą už funkcijos ribų. Kita vertus, nekintančių objektų, tokių kaip eilutės ir eilės, negalima pakeisti vietoje. Todėl, kai funkcijai perduodate nekintamą objektą, bet kokie funkcijos pakeitimai sukuria naują objektą, o pradinis objektas lieka nepakitęs.

Kitas „Python“ kintamųjų tvarkymo aspektas yra suprasti, kaip veikia nuorodos. Kai priskiriate kintamąjį kitam kintamajam, iš tikrųjų priskiriate nuorodą objektui, o ne kopijuojate patį objektą. Tai reiškia, kad jei objektas yra kintamas ir jūs jį modifikuojate naudodami bet kurį kintamąjį, pakeitimai atsispindės visose nuorodose. Šis elgesys gali būti panaudotas siekiant imituoti praeinamąją nuorodą, naudojant kintamus tipus arba pasirinktines klases. Be to, Python tvarkymas su globaliais ir nelokaliais kintamaisiais įdėtosiose funkcijose yra dar vienas būdas valdyti kintamųjų apimtį ir kintamumą.

  1. Ar „Python“ yra praeinamoji reikšmė ar nuoroda?
  2. Python naudoja mechanizmą, vadinamą „pass-by-object-reference“, kai perduodamos nuorodos į objektus, o ne į pačius objektus.
  3. Kodėl mano eilutė nepasikeičia, kai ji perduodama funkcijai?
  4. Python eilutės yra nekintamos, todėl bet koks funkcijos pakeitimas sukuria naują eilutę, o ne keičia originalą.
  5. Kaip galiu imituoti praeinamąją nuorodą su nekintamais tipais?
  6. Naudokite kintamą sudėtinį rodinį, pvz., sąrašą arba žodyną, kad išlaikytumėte nekeičiamą tipą, o vietoj to perduokite konteinerį.
  7. Kas atsitiks, kai iš naujo priskiriu kintamąjį funkcijos viduje?
  8. Iš naujo priskyrus kintamąjį funkcijos viduje, pakeičiama vietinė nuoroda, o ne pradinis kintamasis už funkcijos ribų.
  9. Ar galiu pakeisti globalų kintamąjį funkcijos viduje?
  10. Taip, paskelbus kintamąjį kaip visuotinį naudojant raktažodį.
  11. Kas yra naudojamas raktinis žodis?
  12. The raktinis žodis leidžia keisti kintamuosius artimiausioje įtraukiančioje srityje, kuri nėra visuotinė.
  13. Kaip elgiasi žodynai, kai jie perduodami funkcijoms?
  14. Žodynai, būdami kintami, atspindi pradinio objekto funkcijų pakeitimus.
  15. Ar galiu perduoti pasirinktinį objektą pagal nuorodą Python?
  16. Taip, priskirtų objektų perdavimas veikia kaip kintami tipai, kai funkcijų atributų pakeitimai paveikia pradinį objektą.
  17. Kas yra įvyniojimo klasė ir kaip ji padeda perduodant kintamąjį?
  18. Įpakavimo klasė apima reikšmę, suteikdama kintamą nuorodą į kitaip nekintamą tipą.

Baigiamosios įžvalgos apie Python kintamųjų perdavimą

Norint efektyviai programuoti, labai svarbu suprasti, kaip Python tvarko kintamųjų perdavimą. Naudodami kintamus objektus ir pasirinktines klases, kūrėjai gali imituoti nuorodas, leidžiančias funkcijoms tiesiogiai keisti kintamuosius. Šios žinios padeda rašyti efektyvesnį ir nuspėjamesnį kodą, o tai pagerina gebėjimą valdyti kintamą apimtį ir kintamumą Python programose. Šių metodų įgyvendinimas užtikrina, kad norimi pokyčiai atsispindės visose funkcijų ribose.