Kuidas te mõistate viidamudelit, millele Python programmeerimiskeel põhineb?
sobes.tech AI
Vastus AI-lt
Pythonis on muutujad viited (viited) mälus olevatele objektidele, mitte konteinerid ise väärtuste jaoks. Kui määrame muutuja väärtuse, hakkab see tegelikult viitama sellele objekti, mis sisaldab seda väärtust. Muutmisel muutuja, mis viitab muudetavale objektile (näiteks nimekiri või sõnastik), muudetakse ise objekt, millele muutuja viitab. Kui muutuja, mis viitab muutumatule objektile (näiteks number, string või tühik), muudetakse mälus uus objekt ning muutuja hakkab sellele viitama.
# Muutumatud objekt (int)
a = 10
b = a # a ja b viitavad algselt samale objektile
print(id(a), id(b)) # Sama id
a = 20 # Loob uue objekti 20, a viitab nüüd sellele
print(id(a), id(b)) # Erinev id, b viitab endiselt 10-le
# Muutuv objekt (nimekiri)
list1 = [1, 2, 3]
list2 = list1 # list1 ja list2 viitavad samale nimekirjaobjektile
print(id(list1), id(list2)) # Sama id
list1.append(4) # Muudab objekti, millele mõlemad viitavad
print(list1)
print(list2) # Mõlemad nimekirjad on muudetud
print(id(list1), id(list2)) # Endiselt sama id
Viidete arvutamise mehhanism (reference counting) kasutatakse automaatseks mäluhalduseks. Iga objekt jälgib, mitu muutujat sellele viitab. Kui viidete arv jõuab nulli, muutub objekt kättesaamatuks ning prügikorjaja vabastab selle kasutatud mälu.
Oluline erinevus otse väärtuste hoidmise keeltest (näiteks C): Pythonis, kui määrame b = a, ei kopeerita väärtust a b-sse, vaid b hakkab viitama samale objektile, millele a viitab.