Инструкцията nonlocal в Python

Има случаи, когато във външната функция има променлива, до която трябва да се получи достъп от вътрешната функция. Нека декларираме във функцията 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

В следния код някой програмист е допуснал грешка:

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())

Какво не е наред с този код? Намерете и коригирайте грешката на автора на кода.