Дастури nonlocal дар Python

Ҳолатҳое пеш меоянд, ки дар функсияи берунӣ тағирёбандае вуҷуд дорад, ки ба он дастрасӣ дар функсияи дохилӣ лозим аст. Дар функсияи outer тағирёбандаи i-ро эълон мекунем. Нисбат ба функсияи дохилӣ ин тағирёбанда берунӣ (глобалӣ) хоҳад буд (глобалӣ тағирёбандаҳое ҳастанд, ки ТАНҲО дар рамзи берунӣ эълон шудаанд). Ва ба функсияи inner афзудани як воҳид ба i-ро таъин мекунем:

pythondef outer():
  i = 0

  def inner():
    i += 1  # хатои "local variable 'i' referenced before assignment"

  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

Дар коди зерин баъзе барномасоз хато кардааст:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Ин код чист? Хаторо ёбед ва ислоҳ кунед.

Задание 2

Дар коди зерин баъзе барномасоз хато кардааст:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Ин код чист? Хаторо ёбед ва ислоҳ кунед.