Nonlocal instrukcija Python kalboje

Būna atvejų, kai išorinėje funkcijoje yra kintamasis, prie kurio reikia gauti prieigą vidinėje funkcijoje. Deklaruokime funkcijoje outer kintamąjį i. Vidinės funkcijos atžvilgiu šis kintamasis bus išorinis (globaliais laikomi kintamieji, deklaruoti TIK išoriniame kode). O funkcijai inner nustatykime vieneto pridėjimą prie i:

pythondef outer():
  i = 0

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

  inner()

  return i

Tačiau inner funkcijai kintamasis i yra lokalus, Python laiko jį nedeklaruotu ir išveda atitinkamą klaidą. Anksčiau tokia klaida būdavo ištaisyta naudojant global instrukciją. Tačiau čia i yra išorinis kintamasis, todėl reikėtų naudoti instrukciją nonlocal. Ji paima išvardintus kintamųjų vardus iš artimiausios srities, neįskaitant globalios, t.y. i viduje inner bus paimtas iš kintamojo, deklaruoto aukščiau šios funkcijos:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # išves 1
Задание 1

Toliau pateiktame kode kažkoks programuotojas padarė klaidą:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Kas negerai su šiuo kodu? Raskite ir ištaisykite kodo autoriaus klaidą.

Задание 2

Toliau pateiktame kode kažkoks programuotojas padarė klaidą:

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

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Kas negerai su šiuo kodu? Raskite ir ištaisykite kodo autoriaus klaidą.