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.

Python

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:

Python

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:

Python

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:

Python

copy() alohida obyekt yaratdi, shuning uchun nusxa o’zgarmadi.

Funksiyaga uzatish

Bu qoida funksiyalarda ham amal qiladi va ko’pincha kutilmagan natija beradi:

Python

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:

  1. a = [1, 2, 3] va b = a yozing, so’ng b.append(4) qiling;
  2. a ni chiqaring — o’zgardimi?
  3. id(a) va id(b) ni solishtiring;
  4. c = a.copy() qilib, 1-3 qadamlarni takrorlang;
  5. 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 = a nusxa olmaydi — bitta obyektga ikkinchi yorliq osadi.
  • == qiymatni, is esa aynan bir obyekt ekanini tekshiradi.
  • list, dict, set — o’zgaruvchan; int, str, tuple — o’zgarmas.
  • Haqiqiy nusxa uchun .copy(), ichma-ich tuzilma uchun deepcopy().
  • 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.

Bu dars foydali bo'ldimi?

marta ko'rildi