Instrukcja nonlocal w Pythonie

Zdarzają się przypadki, gdy w funkcji zewnętrznej znajduje się zmienna, do której trzeba uzyskać dostęp w funkcji wewnętrznej. Zadeklarujmy w funkcji outer zmienną i. W stosunku do funkcji wewnętrznej ta zmienna będzie zmienną zewnętrzną (globalnymi są zmienne zadeklarowane TYLKO w kodzie zewnętrznym). A funkcji inner ustawmy dodanie do i jedynki:

pythondef outer():
  i = 0

  def inner():
    i += 1  # wyświetli [4, 9, 25]

  inner()

  return i

Jednak dla inner zmienna i jest lokalna, Python uważa ją za niezadeklarowaną i wyświetla odpowiedni błąd. Wcześniej taki błąd był naprawiany za pomocą instrukcji global. Jednak tutaj i jest zmienną zewnętrzną, dlatego należy użyć instrukcji nonlocal. Pobiera ona wymienione nazwy zmiennych do najbliższego zakresu widoczności, z wyłączeniem globalnego, czyli i wewnątrz inner zostanie pobrana ze zmiennej, zadeklarowanej powyżej tej funkcji:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # wyświetli 1
Задание 1

W następnym kodzie jakiś programista popełnił błąd:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Co jest nie tak z tym kodem? Znajdź i popraw błąd autora kodu.

Задание 2

W następnym kodzie jakiś programista popełnił błąd:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Co jest nie tak z tym kodem? Znajdź i popraw błąd autora kodu.