5.5 Εμβέλεια (scope) μεταβλητών στην Python

Οι εμβελεία (scope) στην Python καθορίζει την περιοχή πρόσβασης μιας μεταβλητής. Συγκεκριμένα, στην Python υπάρχουν τέσσερις βασικοί τύποι εμβελείας για τις μεταβλητές:

  1. Τοπική εμβέλεια (Local Scope): Οι μεταβλητές που ορίζονται μέσα σε μια συνάρτηση έχουν τοπική εμβέλεια και είναι προσβάσιμες μόνο μέσα στη συνάρτηση αυτή.
  2. Εμβέλεια περιβάλλοντος συνάρτησης (Enclosing Function Scope): Σε περίπτωση εμφωλευμένων συναρτήσεων, μια μεταβλητή που ορίζεται σε μια γονική συνάρτηση έχει εμβέλεια περιβάλλοντος συνάρτησης και είναι προσβάσιμη από τις εμφωλευμένες συναρτήσεις.
  3. Καθόληκη εμβέλεια (Global Scope): Οι μεταβλητές που ορίζονται σε επίπεδο προγράμματος, έξω από όλες τις συναρτήσεις, έχουν καθολήκη εμβέλεια και είναι προσβάσιμες από οποιοδήποτε σημείο του προγράμματος.
  4. Ενσωματωμένη εμβέλεια (Built-in Scope): Αυτή η εμβέλεια περιλαμβάνει τα ονόματα που παρέχονται από τη γλώσσα Python, όπως οι ενσωματωμένες συναρτήσεις και οι εξαιρέσεις. Αυτά τα ονόματα είναι διαθέσιμα σε ολόκληρο το πρόγραμμα.

Με τη χρήση αυτών των εμβελειών, μπορούμε να καθορίσουμε την ορατότητα και την πρόσβαση μιας μεταβλητής σε διάφορα τμήματα του προγράμματος.

Είναι σημαντικό να κατανοήσετε το εύρος ισχύος των μεταβλητών στην Python, καθώς αυτό επηρεάζει την προσβασιμότητα και τη διάρκεια ζωής των μεταβλητών στο πρόγραμμά σας. Το εύρος ισχύος καθορίζει πού μπορείτε να αναφερθείτε σε μια μεταβλητή και για πόσο καιρό θα παραμείνει ενεργή.

Επιπλέον, είναι σημαντικό να αποφεύγετε τη χρήση ονομάτων μεταβλητών που επικαλύπτονται (shadowing), δηλαδή τη χρήση του ίδιου ονόματος για διαφορετικές μεταβλητές σε διάφορα επίπεδα ισχύος. Αυτό μπορεί να οδηγήσει σε σφάλματα και σύγχυση, καθώς η Python θα αναφέρεται στην πιο κοντινή μεταβλητή με το ίδιο όνομα.

Για να αποφευχθούν αυτά τα προβλήματα, πρέπει να είστε προσεκτικοί κατά τη δήλωση και χρήση των μεταβλητών σας, να επιλέξετε κατάλληλα ονόματα που να είναι περιγραφικά και να ακολουθείτε τις κατευθυντήριες γραμμές και τις καλές πρακτικές της Python.

Για να προσπελάσετε μια μεταβλητή στο επίπεδο του προγράμματος από μια συνάρτηση στην Python, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί “global” πριν το όνομα της μεταβλητής. Αυτό δηλώνει στην Python ότι θέλετε να αναφερθείτε στην καθολική μεταβλητή και όχι να δημιουργήσετε μια νέα τοπική μεταβλητή με το ίδιο όνομα.

[adinserter block=”2″]

Ας δούμε το παράδειγμα με την αντικατάσταση της λέξης “παγκόσμια” με “καθολική”:

x = 10  # Καθολική μεταβλητή

def outer_function():
    y = 5  # Τοπική μεταβλητή στη συνάρτηση outer_function

    def inner_function():
        z = 3  # Τοπική μεταβλητή στη συνάρτηση inner_function
        print("x (καθολική):", x)  # Εκτύπωση της καθολικής μεταβλητής x
        print("y (τοπική στη συνάρτηση outer_function):", y)  # Εκτύπωση της τοπικής μεταβλητής y της συνάρτησης outer_function
        print("z (τοπική στη συνάρτηση inner_function):", z)  # Εκτύπωση της τοπικής μεταβλητής z της συνάρτησης inner_function

    inner_function()

outer_function()

print("x (καθολική):", x)  # Εκτύπωση της καθολικής μεταβλητής x μετά την εκτέλεση της συνάρτησης

Ο παραπάνω κώδικας περιέχει μια καθολική μεταβλητή x με τιμή 10. Ορίζεται μια συνάρτηση outer_function, η οποία περιλαμβάνει μια τοπική μεταβλητή y με τιμή 5. Εντός της outer_function ορίζεται μια εμφωλευμένη συνάρτηση inner_function, η οποία περιλαμβάνει μια τοπική μεταβλητή z με τιμή 3.

Όταν καλείται η inner_function, εκτυπώνονται οι τιμές των μεταβλητών x, y και z. Η τιμή της καθολικής μεταβλητής x εκτυπώνεται ως “x (καθολική)” και η τιμή της τοπικής μεταβλητής y εκτυπώνεται ως “y (τοπική στη συνάρτηση outer_function)”. Επίσης, εκτυπώνεται η τιμή της τοπικής μεταβλητής z ως “z (τοπική στη συνάρτηση inner_function)”.

Μετά την εκτέλεση της inner_function, εκτυπώνεται η τιμή της καθολικής μεταβλητής x με το μήνυμα “x (καθολική)”.

Έτσι, ο κώδικας εκτυπώνει τις τιμές των μεταβλητών x, y και z σε διάφορα σημεία του προγράμματος, δείχνοντας τη διαφορά μεταξύ καθολικών και τοπικών μεταβλητών.

Μια μεταβλητή που δημιουργείται μέσα σε μια συνάρτηση είναι διαθέσιμη μόνο εντός αυτής της συνάρτησης:

def my_function():
    inside_variable = "Καλησπέρα"  # Δημιουργία της μεταβλητής inside_variable και αρχικοποίησή της με την τιμή "Καλησπέρα"
    print(inside_variable)  # Εκτύπωση της μεταβλητής inside_variable

my_function()  # Κλήση της συνάρτησης my_function

# Η παρακάτω γραμμή θα προκαλέσει σφάλμα, επειδή η μεταβλητή inside_variable δεν είναι προσβάσιμη εκτός της συνάρτησης
# print(inside_variable)

Ο παραπάνω κώδικας περιέχει την ορισμένη συνάρτηση my_function. Όταν καλείται η συνάρτηση με τη γραμμή κώδικα my_function(), εκτελείται ο εσωτερικός κώδικας της συνάρτησης.

Στο εσωτερικό της συνάρτησης, δημιουργείται μια τοπική μεταβλητή με όνομα inside_variable και της ανατίθεται η τιμή "Καλησπέρα". Στη συνέχεια, η τιμή αυτή εκτυπώνεται στην οθόνη με τη χρήση της εντολής print(inside_variable).

Έτσι, όταν η συνάρτηση my_function() καλείται, θα εκτυπωθεί η φράση "Καλησπέρα". Ωστόσο, η γραμμή κώδικα print(inside_variable) που βρίσκεται μετά την κλήση της συνάρτησης θα προκαλέσει σφάλμα, καθώς η μεταβλητή inside_variable δεν είναι προσβάσιμη εκτός της συνάρτησης.

[adinserter block=”3″]

Όπως εξηγήθηκε στο παραπάνω παράδειγμα, η μεταβλητή x δεν είναι διαθέσιμη έξω από τη συνάρτηση, αλλά είναι διαθέσιμη για οποιαδήποτε συνάρτηση μέσα στη συνάρτηση:

def outer_function():
    x = "Καλησπέρα"  # Αρχικοποίηση της μεταβλητής x με την τιμή "Καλησπέρα"

    def inner_function():
        print(x)  # Εκτύπωση της μεταβλητής x, η οποία είναι προσβάσιμη από την εσωτερική συνάρτηση

    inner_function()  # Κλήση της εσωτερικής συνάρτησης

outer_function()  # Κλήση της εξωτερικής συνάρτησης

# Η παρακάτω γραμμή θα προκαλέσει σφάλμα, επειδή η μεταβλητή x δεν είναι προσβάσιμη εκτός της συνάρτησης
# print(x)

Ο παραπάνω κώδικας κάνει τα εξής:

  1. Ορίζεται η συνάρτηση outer_function.
  2. Εντός της outer_function, ορίζεται η μεταβλητή x με την τιμή "Καλησπέρα".
  3. Ορίζεται η εσωτερική συνάρτηση inner_function.
  4. Εντός της inner_function, εκτυπώνεται η τιμή της μεταβλητής x.
  5. Καλείται η inner_function.
  6. Καλείται η outer_function.
  7. Εκτυπώνεται η τιμή της μεταβλητής x εντός της inner_function.
  8. Επιχειρείται η εκτύπωση της μεταβλητής x έξω από τη συνάρτηση, η οποία προκαλεί σφάλμα, καθώς η μεταβλητή x δεν είναι προσβάσιμη σε αυτό το σημείο του κώδικα.

Αν χρησιμοποιείτε το ίδιο όνομα μεταβλητής μέσα και έξω από μια συνάρτηση, το Python θα τις αντιμετωπίσει ως δύο ξεχωριστές μεταβλητές, μία διαθέσιμη στην καθολική εμβέλεια (έξω από τη συνάρτηση) και μία διαθέσιμη στην τοπική εμβέλεια (μέσα στη συνάρτηση):

x = "Καλημέρα"  # Αρχικοποίηση της μεταβλητής x με την τιμή "Καλημέρα"

def my_function():
    x = "Καλησπέρα"  # Αρχικοποίηση της μεταβλητής x με την τιμή "Καλησπέρα" εντός της συνάρτησης
    print("Μέσα στη συνάρτηση, το x είναι:", x)  # Εκτύπωση της τιμής της μεταβλητής x μέσα στη συνάρτηση

my_function()  # Κλήση της συνάρτησης

print("Έξω από τη συνάρτηση, το x είναι:", x)  # Εκτύπωση της τιμής της μεταβλητής x έξω από τη συνάρτηση

Ο παραπάνω κώδικας κάνει τα εξής:

  1. Αρχικοποιεί τη μεταβλητή x με την τιμή "Καλημέρα".
  2. Ορίζει μια συνάρτηση με όνομα my_function.
  3. Μέσα στη συνάρτηση, αρχικοποιεί τη μεταβλητή x με την τιμή "Καλησπέρα".
  4. Εκτυπώνει τη φράση “Μέσα στη συνάρτηση, το x είναι:” ακολουθούμενη από την τιμή της μεταβλητής x μέσα στη συνάρτηση.
  5. Καλεί τη συνάρτηση my_function, προκαλώντας την εκτέλεσή της.
  6. Εκτυπώνει τη φράση “Έξω από τη συνάρτηση, το x είναι:” ακολουθούμενη από την τιμή της μεταβλητής x έξω από τη συνάρτηση.

Συνολικά, ο κώδικας εκτυπώνει την τιμή της μεταβλητής x μέσα και έξω από τη συνάρτηση, ώστε να επιβεβαιωθεί η διαφορά των τιμών που έχει λόγω της τοπικής της αρχικοποίησης.

[adinserter block=”4″]

Εάν χρειάζεστε να δημιουργήσετε μια καθολική μεταβλητή, αλλά βρίσκεστε στην τοπική εμβέλεια, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί global. Η λέξη-κλειδί global καθιστά τη μεταβλητή καθολική.

def my_function():
    global x  # Ορισμός της μεταβλητής x ως global για να είναι προσπελάσιμη από τη συνάρτηση
    x = "Hello"  # Ανάθεση της τιμής "Hello" στη μεταβλητή x

my_function()  # Κλήση της συνάρτησης my_function

print("The value of x is:", x)  # Εκτύπωση του μηνύματος "The value of x is:" ακολουθούμενο από την τιμή της μεταβλητής x

Ο παραπάνω κώδικας κάνει τα εξής:

  1. Ορίζει μια συνάρτηση με όνομα my_function.
  2. Μέσα στη συνάρτηση, ορίζει τη μεταβλητή x ως global χρησιμοποιώντας την δήλωση global x. Αυτό σημαίνει ότι η μεταβλητή x θα είναι προσπελάσιμη και μετά το πέρας της συνάρτησης.
  3. Αναθέτει την τιμή "Hello" στη μεταβλητή x.
  4. Καλεί τη συνάρτηση my_function(), η οποία εκτελείται.
  5. Εκτυπώνει το μήνυμα "The value of x is:" ακολουθούμενο από την τιμή της μεταβλητής x.

Επίσης, χρησιμοποιήστε τη λέξη-κλειδί global εάν θέλετε να κάνετε μια αλλαγή σε μια καθολική μεταβλητή μέσα σε μια συνάρτηση.

x = "Καλημέρα"  # Αρχική τιμή της μεταβλητής x, η οποία είναι η συμβολοσειρά "Καλημέρα"

def my_function():
    global x  # Δήλωση της μεταβλητής x ως global για να μπορεί να τροποποιηθεί εκτός του πεδίου της συνάρτησης
    x = "Καλησπέρα"  # Τροποποίηση της τιμής της μεταβλητής x σε "Καλησπέρα" μέσα στη συνάρτηση

my_function()  # Κλήση της συνάρτησης για να τροποποιηθεί η τιμή της μεταβλητής x

print("Η τιμή του x μετά την κλήση της συνάρτησης είναι:", x)  # Εκτύπωση της τιμής της μεταβλητής x μετά την κλήση της συνάρτησης

Ο παραπάνω κώδικας κάνει τα εξής:

  1. Ορίζει τη μεταβλητή x και την αρχικοποιεί με τη συμβολοσειρά "Καλημέρα".
  2. Ορίζει μια συνάρτηση με όνομα my_function.
  3. Μέσα στη συνάρτηση, χρησιμοποιεί τη δήλωση global για να δηλώσει ότι η μεταβλητή x που θα χρησιμοποιηθεί είναι η ίδια με αυτήν που έχει οριστεί στο επίπεδο του προγράμματος.
  4. Τροποποιεί την τιμή της μεταβλητής x μέσα στη συνάρτηση, αλλάζοντάς τη σε "Καλησπέρα".
  5. Καλεί τη συνάρτηση my_function, που έχει ως αποτέλεσμα την τροποποίηση της τιμής της μεταβλητής x.
  6. Εκτυπώνει τη φράση "Η τιμή του x μετά την κλήση της συνάρτησης είναι:" ακολουθούμενη από την τιμή της μεταβλητής x.
7 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων