Xotira va o'zgaruvchilar hayoti
Shu paytgacha o’zgaruvchilarni ishlatib keldik, lekin ular xotirada aslida qanday saqlanishiga to’xtalmadik. Bu mavzu boshida ortiqcha tuyuladi — biroq aynan u tushunilmagani sababli Python’da eng chalkash xatolar yuz beradi.
O’zgaruvchi — quti emas, yorliq
Ko’pchilik o’zgaruvchini “qiymat solinadigan quti” deb tasavvur qiladi. Python’da bu tasavvur noto’g’ri. Bu yerda o’zgaruvchi — xotiradagi obyektga osilgan yorliq.
Natijaga e’tibor bering: b ga qo’shdik, lekin a ham o’zgardi. Sabab —
nusxa olinmagan. b = a yozilganda ikkinchi ro’yxat yaratilmaydi; bitta
ro’yxatga ikkinchi yorliq osiladi.
id() — obyektning manzili
Ikki o’zgaruvchi bir obyektni ko’rsatayotganini id() bilan tekshirsa bo’ladi:
Bu yerda ikki muhim tushuncha ajraladi:
==— qiymatlar tengmi?is— bu bitta obyektning o’zimi?
a va c ning qiymati bir xil, lekin ular alohida obyektlar.
O’zgaruvchan va o’zgarmas turlar
Python turlari ikki guruhga bo’linadi va ularning xatti-harakati farq qiladi.
| O’zgarmas (immutable) | O’zgaruvchan (mutable) |
|---|---|
int, float, bool |
list |
str |
dict |
tuple |
set |
O’zgarmas obyektni o’zgartirib bo’lmaydi — faqat yangisini yaratish mumkin:
id o’zgardi — demak eski obyekt tahrirlanmadi, o’rniga yangisi yaratildi va
yorliq unga ko’chdi.
Nusxa olish
Haqiqiy nusxa kerak bo’lsa, uni ochiq so’rash lozim:
copy() alohida obyekt yaratdi, shuning uchun nusxa o’zgarmadi.
Funksiyaga uzatish
Bu qoida funksiyalarda ham amal qiladi va ko’pincha kutilmagan natija beradi:
Ro’yxat o’zgardi, son esa o’zgarmadi. Sabab: ro’yxat o’zgaruvchan — funksiya asl obyektni tahrirladi. Son o’zgarmas — funksiya ichida yangi obyekt yaratildi va tashqaridagi yorliqqa ta’sir qilmadi.
Obyekt qachon o’chadi
Python xotirani o’zi tozalaydi. Har obyekt nechta yorliq ko’rsatayotganini sanaydi; son nolga tushganda obyekt o’chiriladi.
a = [1, 2, 3] # ro'yxatga 1 ta havola
b = a # 2 ta havola
del a # 1 ta havola — obyekt yashaydi
del b # 0 ta havola — obyekt o'chiriladi
Amaliy mashq
Yorliq va obyektni ajrating:
a = [1, 2, 3]vab = ayozing, so’ngb.append(4)qiling;ani chiqaring — o’zgardimi?id(a)vaid(b)ni solishtiring;c = a.copy()qilib, 1-3 qadamlarni takrorlang;- xuddi shuni son bilan sinab ko’ring:
x = 5,y = x,y += 1.
Nega ro’yxatda natija boshqacha, sonda esa boshqacha?
Qisqacha xulosa
- Python’da o’zgaruvchi — quti emas, obyektga osilgan yorliq.
b = anusxa olmaydi — bitta obyektga ikkinchi yorliq osadi.==qiymatni,isesa aynan bir obyekt ekanini tekshiradi.list,dict,set— o’zgaruvchan;int,str,tuple— o’zgarmas.- Haqiqiy nusxa uchun
.copy(), ichma-ich tuzilma uchundeepcopy(). - Funksiya o’zgaruvchan obyektni tahrirlashi mumkin — ehtiyot bo’ling.
- Xotirani axlat yig’uvchi avtomatik tozalaydi.
Keyingi darsda performance — kodni tezlashtirish: yozilgan kod nega sekin ishlashi va uni qanday o’lchash mumkinligini ko’ramiz.