Python даги nonlocal инструкцияси

Ташқи функцияда ички функция томонидан кириш учун зарур бўлган ўзгарувчи бўлган ҳоллар мавжуд. Функцияда outer ўзгарувчисини i э'лон қиламиз. Ички функцияга нисбатан бу ўзгарувчи ташқи (глобал бўлган ўзгарувчилар фақат ташқи кодда э'лон қилинган) бўлади. Ва inner функциясига i га биттани қўшиш вазифасини берамиз:

pythondef outer():
  i = 0

  def inner():
    i += 1  # [4, 9, 25] ни кўрсатади

  inner()

  return i

Аммо inner учун i ўзгарувчиси локал бўлиб, Python уни э'лон қилинмаган ҳисоблайди ва мос хатоликни кўрсатади. Илгари бундай хатолик global инструкцияси орқали тўғриланган. Аммо бу ерда i ташқи ўзгарувчи бўлгани учун, nonlocal инструкциясини ишлатиш керак. У глобалдан ташқари, яъни i inner ичида ушбу функциядан юқорида э'лон қилинган ўзгарувчидан олинади:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # 1 ни кўрсатади
Задание 1

Куйидаги кодда бир программист хатолik қилган:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Бу кодда нима хато? Код муаллифининг хатосини топинг ва тўғриланг.

Задание 2

Куйидаги кодда бир программист хатолik қилган:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Бу кодда нима хато? Код муаллифининг хатосини топинг ва тўғриланг.