IV OSA sisukord |
4.2 MUTEERIMINE
Me oleme oma kursuste jooksul ikka mingite muutujate väärtust muutnud. Juba termin muutuja isegi viitab muutumisele.
a = 5 a = 7 a += 4
Vaatame nüüd sedagi aspekti mõnevõrra sügavamalt.
a = 5 print(id(a)) a = 7 print(id(a)) a += 4 print(id(a))
annab tulemuseks (näiteks):
1464424784 1464424816 1464424880
Näeme, et iga omistamisega salvestati muutujasse a
uus viit, mis siis viitab ka uuele objektile.
Mis juhtub, kui esimese omistamise järel antakse sama viit ka teisele muutujale?
Ka viitade vaatamine kinnitab, et a
ja b
lähevad pärast muutujale a
uue väärtuse andmist kumbki oma teed.
a = 5 b = a print(id(a)) print(id(b)) a = 7 print(id(a)) print(id(b))
Seega võib öelda, et muutuja a
sai uue väärtuse - vana väärtus oli 5 ja uus on 7. Samas seda väärtust 5 mälu täisarvulise objektina ei muudetud. Nüüd on muutujasse a
salvestatud uus viit, mis viitab täisarvulisel objektile väärtusega 7. Päris hävingule see väärtusega 5 objekt ka mõeldud pole, sest muutujas b
olev viit jääb talle viitama.
Samamoodi juhtus ka a += 4
korral - uus väärtus uue viidaga.
Niisiis tegelikult pole täisarvu võimalik muuta. Kui seda tahaksime teha, siis tegelikult võetakse kohe uus objekt, mitte ei “parandata” vana. Sedalaadi andmetüüpe nimetatakse mittemuteeritavateks. Kui mingi objekt on loodud, siis selliseks ta jääb kogu oma eksisteerimise aja. Kui ta sellisena enam vajalik pole, siis visatakse ära. Eks nii kipub päriseluski tänapäeval mitmete asjadega olema.
Sõnu muteeritav, mittemuuteritav ja muteerima Õigekeelsussõnaraamatus pole. Samas on seal sõnad muteeruma ja mutatsioon. Seega kui me midagi muteerime, siis see asi muteerub ja toimub mutatsioon. Eks võiks ka tavakeelsemalt muutmisest, muutumisest ja muutusest rääkida, aga programmeerimises kasutatakse täpsuse eesmärgil siiski veidi võõrapärasemaid termineid nagu ka Aivar Annamaa programmeerimise õpikus.
Mittemuteeritavad (ingl immutable) on näiteks arvud, sõned, ennikud ja tõeväärtused. Muteeritavad (ingl mutable) on aga näiteks järjendid, hulgad ja sõnastikud. Muteeritavate objektide puhul on olemas võimalused nende muutmiseks - muteerimiseks. Näiteks saab elemente lisada, eemaldada ja välja vahetada.
Eelmise alapunkti lõpus jäi õhku selgitus, et miks arvude, sõnede ja ennikute puhul, vähemalt mingitel juhtudel, antakse viit samale objektile ka siis, kui muutujatpidi (b = a
) omistamist pole. Nt
c = 6 d = 6
Nimelt võidakse mittemuteeritavate tüüpide korral nii korraldada, et ükskõik millisele muutujale vastav väärtus antakse, siis see võetakse samast kohast mälus, seega viit on sama. Kuna neid väärtusi nagunii muuta ei saa, siis pole muret sellega, et mingile väärtusele erinevate (ka omavahel seostamata) muutujate poolt viidatud on.
IV OSA sisukord |