Kaip suprantate nuorodų modelį, ant kurio pagrįsta Python programavimo kalba?
sobes.tech AI
Atsakymas iš AI
Python kalbant, kintamieji yra nuorodos (ryšiai) į atmintyje esančius objektus, o ne jų pačių reikšmių konteineriai. Kai priskiriame reikšmę kintamajam, jis iš tikrųjų pradeda rodyti į objektą, kuriame yra ši reikšmė. Kai keičiasi kintamasis, kuris nurodo keičiamą objektą (pvz., sąrašą ar žodyną), keičiasi pats objektas, į kurį nurodo kintamasis. Kai keičiasi kintamasis, kuris nurodo nekintamą objektą (pvz., skaičių, eilutę ar tuple), atmintyje sukuriamas naujas objektas, ir kintamasis pradeda rodyti į jį.
# Nekintamas objektas (int)
a = 10
b = a # pradžioje a ir b nurodo tą patį objektą
print(id(a), id(b)) # Tie patys ID
a = 20 # Sukuriamas naujas 20 objektas, į kurį nurodo a
print(id(a), id(b)) # Skirtingi ID, b vis dar nurodo į 10
# Keičiamas objektas (sąrašas)
list1 = [1, 2, 3]
list2 = list1 # abu nurodo tą patį sąrašą
print(id(list1), id(list2)) # Tie patys ID
list1.append(4) # Keičia objektą, į kurį nurodo abu
print(list1)
print(list2) # Abu sąrašai pakeisti
print(id(list1), id(list2)) # Vis dar tie patys ID
Nuorodų skaičiavimo mechanizmas naudojamas automatiškai atminties valdymui. Kiekvienas objektas stebi, kiek kintamųjų į jį nukreipia. Kai šis skaičius pasiekia nulį, objektas tampa neprieinamas, ir šiukšlių surinkėjas atlaisvina užimamą atmintį.
Svarbus skirtumas nuo kalbų, kurios saugo reikšmes tiesiogiai kintamuosiuose (pvz., C), yra tas, kad Python'e, rašant b = a, a reikšmė nėra kopijuojama į b, o b pradeda nurodyti tą patį objektą kaip ir a.