Η δήλωση nonlocal στην Python
Υπάρχουν περιπτώσεις όπου σε μια εξωτερική συνάρτηση
υπάρχει μια μεταβλητή, στην οποία χρειάζεται να έχουμε
πρόσβαση από την εσωτερική συνάρτηση. Ας δηλώσουμε στην
συνάρτηση outer τη μεταβλητή i.
Σε σχέση με την εσωτερική συνάρτηση, αυτή η
μεταβλητή θα είναι εξωτερική (καθολικές είναι
οι μεταβλητές που δηλώνονται ΜΟΝΟ
στον εξωτερικό κώδικα). Και στη συνάρτηση inner
θα ορίσουμε την πρόσθεση στο i της μονάδας:
def outer():
i = 0
def inner():
i += 1 # θα εμφανίσει [4, 9, 25]
inner()
return i
Ωστόσο, για την inner η μεταβλητή i
είναι τοπική, η Python την θεωρεί
αδήλωτη και εμφανίζει το αντίστοιχο
σφάλμα. Παλαιότερα, ένα τέτοιο σφάλμα διορθωνόταν
χρησιμοποιώντας τη δήλωση global. Ωστόσο
εδώ η i είναι εξωτερική μεταβλητή,
επομένως θα πρέπει να χρησιμοποιήσουμε τη δήλωση
nonlocal. Αυτή παίρνει τα αναγραφόμενα
ονόματα μεταβλητών στην πλησιέστερη περιοχή
ορατότητας, εξαιρώντας την καθολική, δηλαδή η i
μέσα στην inner θα ληφθεί από τη μεταβλητή,
που δηλώθηκε πριν από αυτήν τη συνάρτηση:
def outer():
i = 0
def inner():
nonlocal i
i += 1
inner()
return i
print(outer()) # θα εμφανίσει 1
Στον επόμενο κώδικα, κάποιος προγραμματιστής παρέλειψε ένα σφάλμα:
num = 10
def outer():
num = 5
def inner():
num -= 2
inner()
return num
print(outer())
Τι συμβαίνει με αυτόν τον κώδικα; Βρείτε και διορθώστε το σφάλμα του συγγραφέα του κώδικα.
Στον επόμενο κώδικα, κάποιος προγραμματιστής παρέλειψε ένα σφάλμα:
num = 3
def outer():
num += 1
tst = num
def inner():
tst = tst ** 3
inner()
return tst
print(outer())
Τι συμβαίνει με αυτόν τον κώδικα; Βρείτε και διορθώστε το σφάλμα του συγγραφέα του κώδικα.