Η δήλωση 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())

Τι συμβαίνει με αυτόν τον κώδικα; Βρείτε και διορθώστε το σφάλμα του συγγραφέα του κώδικα.