Nonlocal-käsky Pythonissa

On tilanteita, joissa ulkoisessa funktiossa on muuttuja, johon sisäisessä funktiossa tarvitaan pääsy. Esitellään funktiossa outer muuttuja i. Sisäiseen funktioon nähden tämä muuttuja on ulkoinen (globaaleja ovat vain ulkoisessa koodissa esitellyt muuttujat). Ja funktiolle inner asetaan yhden lisääminen i:hin:

pythondef outer():
  i = 0

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

  inner()

  return i

Kuitenkin inner:lle muuttuja i on paikallinen, Python pitää sitä esittelemättömänä ja tulostaa vastaavan virheen. Aikaisemmin tällainen virhe korjattiin global-käskyllä. Kuitenkin tässä i on ulkoinen muuttuja, joten tulisi käyttää nonlocal-käskyä. Se ottaa luetellut muuttujien nimet lähimpään näkyvyysalueeseen, pois lukien globaalin, eli i inner:n sisällä otetaan muuttujasta, joka on esitelty ylempänä kuin tämä funktio:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

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

Seuraavassa koodissa eräs ohjelmoija teki virheen:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Mikä on vialla tässä koodissa? Etsi ja korjaa koodin tekijän virhe.

Задание 2

Seuraavassa koodissa eräs ohjelmoija teki virheen:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Mikä on vialla tässä koodissa? Etsi ja korjaa koodin tekijän virhe.