Інструкцыя 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())

Што не так з гэтым кодам? Знайдзіце і выпраўце памылку аўтара кода.