Istruzione nonlocal in Python

Ci sono casi in cui in una funzione esterna è presente una variabile a cui è necessario accedere dalla funzione interna. Dichiariamo nella funzione outer la variabile i. Rispetto alla funzione interna, questa variabile sarà esterna (sono globali solo le variabili dichiarate nel codice esterno). E alla funzione inner assegniamo l'aggiunta di uno a i:

pythondef outer():
  i = 0

  def inner():
    i += 1  # darà [4, 9, 25]

  inner()

  return i

Tuttavia, per inner la variabile i è locale, Python la considera non dichiarata e restituisce il corrispondente errore. In passato, un errore simile veniva corretto usando l'istruzione global. Tuttavia qui i è una variabile esterna, quindi si dovrebbe usare l'istruzione nonlocal. Prende i nomi elencati delle variabili nell'ambito di visibilità più vicino, escludendo quello globale, cioè i all'interno di inner sarà presa dalla variabile dichiarata sopra questa funzione:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # darà 1
Задание 1

Nel codice seguente un programmatore ha commesso un errore:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Cosa non va in questo codice? Trovate e correggete l'errore dell'autore del codice.

Задание 2

Nel codice seguente un programmatore ha commesso un errore:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Cosa non va in questo codice? Trovate e correggete l'errore dell'autore del codice.