Python-dagi nonlocal instruksiyasi

Ba'zi hollarda tashqi funksiyada ichki funksiya tomonidan kirish imkoni bo'lishi kerak bo'lgan o'zgaruvchi bo'ladi. Keling, outer funksiyasida i o'zgaruvchisini e'lon qilaylik. Ichki funksiyaga nisbatan bu o'zgaruvchi tashqi (global o'zgaruvchilar faqatgina tashqi kodda e'lon qilingan o'zgaruvchilardir) hisoblanadi. inner funksiyasiga i ga bir qo'shish vazifasini beraylik:

pythondef outer():
  i = 0

  def inner():
    i += 1  # [4, 9, 25] ni chiqaradi

  inner()

  return i

Biroq inner uchun i o'zgaruvchisi lokal hisoblanadi, Python uni e'lon qilinmagan deb hisoblaydi va mos xatolikni chiqaradi. Ilgari bunday xatolik global instruksiyasi yordamida tuzatilgan. Ammo bu yerda i tashqi o'zgaruvchi hisoblanadi, shuning uchun nonlocal instruksiyasidan foydalanish kerak. U ko'rsatilgan o'zgaruvchilar nomlarini globalni istisno qilgan holda, ya'ni eng yaqin ko'rish sohasidan oladi, i inner ichida ushbu funksiyadan yuqorida e'lon qilingan o'zgaruvchi bilan olinadi:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # 1 ni chiqaradi
Задание 1

Quyidagi kodda ma'lum bir dasturchi xatoga yo'l qo'ydi:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Ushbu kodda nima noto'g'ri? Kod muallifining xatosini toping va tuzating.

Задание 2

Quyidagi kodda ma'lum bir dasturchi xatoga yo'l qo'ydi:

pythonnum = 3
def outer():
  num += 1
  tst = num

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Ushbu kodda nima noto'g'ri? Kod muallifining xatosini toping va tuzating.