Κανόνες Εμβέλειας (Scope Rules) στην Python
Η εμβέλεια μιας μεταβλητής καθορίζει το πού και πώς μπορεί να χρησιμοποιηθεί μέσα στο πρόγραμμα. Η εμβέλεια μπορεί να είναι είτε τοπική (local) είτε καθολική (global).
Τοπική Εμβέλεια (Local Scope)
Μια μεταβλητή με τοπική εμβέλεια είναι “σε εμβέλεια” μόνο εντός της συνάρτησης όπου ορίζεται. Αυτό σημαίνει ότι μια τοπική μεταβλητή μπορεί να χρησιμοποιηθεί μόνο εντός της συνάρτησης που την ορίζει και “βγαίνει από την εμβέλεια” όταν η συνάρτηση επιστρέφει στον καλούντα.
Καθολική Εμβέλεια (Global Scope)
Μεταβλητές που ορίζονται εκτός οποιασδήποτε συνάρτησης (ή κλάσης) έχουν καθολική εμβέλεια. Αυτές περιλαμβάνουν συναρτήσεις, μεταβλητές και κλάσεις. Μεταβλητές με καθολική εμβέλεια αποκαλούνται καθολικές μεταβλητές. Μεταβλητές με καθολική εμβέλεια μπορούν να χρησιμοποιηθούν σε ολόκληρο το αρχείο .py ή τη διαδραστική συνεδρία, αφού έχουν οριστεί.
Πρόσβαση σε Καθολική Μεταβλητή από Συνάρτηση
Μπορείτε να αποκτήσετε πρόσβαση στην τιμή μιας καθολικής μεταβλητής εντός μιας συνάρτησης:
# Καθολική μεταβλητή global_variable = 10 def demo_function(): # Πρόσβαση στην καθολική μεταβλητή εντός της συνάρτησης print("Καθολική τιμή:", global_variable) demo_function()
Σημαντικές Παρατηρήσεις
- Οι τοπικές μεταβλητές είναι προσβάσιμες μόνο εντός της συνάρτησης που τις ορίζει.
- Οι καθολικές μεταβλητές είναι προσβάσιμες σε ολόκληρο το πρόγραμμα μετά τον ορισμό τους.
- Η χρήση καθολικών μεταβλητών πρέπει να γίνεται με προσοχή για να αποφεύγονται σφάλματα και περίπλοκες εξαρτήσεις στον κώδικα.
Μπλοκ έναντι Συνόλων Εντολών (Blocks vs. Suites)
Στην Python, όταν ορίζετε μια μεταβλητή εντός ενός μπλοκ ή ενός συνόλου εντολών (suite), η εμβέλεια της μεταβλητής καθορίζεται από το πού έχει γραφτεί αυτή η εντολή.
Μπλοκ Συναρτήσεων
Όταν δημιουργείτε μια μεταβλητή μέσα σε ένα μπλοκ συνάρτησης, αυτή η μεταβλητή είναι τοπική στο συγκεκριμένο μπλοκ. Αυτό σημαίνει ότι η μεταβλητή είναι προσβάσιμη μόνο εντός της συνάρτησης και δεν είναι διαθέσιμη έξω από αυτήν.
Σύνολα Εντολών Ελέγχου (Control Statement Suites)
Όταν δημιουργείτε μια μεταβλητή εντός του συνόλου εντολών ενός δομικού στοιχείου ελέγχου (όπως if
, for
, while
κτλ.), η εμβέλεια της μεταβλητής εξαρτάται από το πού έχει οριστεί το δομικό στοιχείο ελέγχου:
- Εάν το δομικό στοιχείο ελέγχου βρίσκεται στην καθολική εμβέλεια: Οι μεταβλητές που ορίζονται στο σύνολο εντολών έχουν καθολική εμβέλεια.
- Εάν το δομικό στοιχείο ελέγχου βρίσκεται εντός ενός μπλοκ συνάρτησης: Οι μεταβλητές που ορίζονται στο σύνολο εντολών έχουν τοπική εμβέλεια.
Αυτή η διάκριση είναι σημαντική καθώς καθορίζει πού και πώς μπορείτε να χρησιμοποιήσετε τις μεταβλητές σας μέσα στο πρόγραμμά σας. Η περαιτέρω συζήτηση γύρω από την εμβέλεια θα συνεχιστεί στο κεφάλαιο “Αντικειμενοστραφής Προγραμματισμός” όταν εισαχθούν οι προσαρμοσμένες κλάσεις.
Απόκρυψη Ενσωματωμένων Συναρτήσεων (Shadowing Functions)
Στην Python, όταν δημιουργείτε μια μεταβλητή με το ίδιο όνομα με μια ενσωματωμένη συνάρτηση, τότε “αποκρύπτετε” ή “σκιάζετε” την ενσωματωμένη συνάρτηση. Αυτό σημαίνει ότι η αρχική λειτουργία της συνάρτησης γίνεται απροσπέλαστη μέσα στον κώδικά σας.
Παράδειγμα Απόκρυψης Ενσωματωμένης Συνάρτησης
Για παράδειγμα, η sum
είναι μια ενσωματωμένη συνάρτηση στην Python που χρησιμοποιείται για το άθροισμα στοιχείων μιας λίστας ή οποιουδήποτε περιηγήσιμου αντικειμένου. Αν ορίσετε μια μεταβλητή με το όνομα sum
, τότε αυτή η μεταβλητή κρύβει την ενσωματωμένη συνάρτηση:
# Ορισμός μεταβλητής με το όνομα sum sum = 15 # Προσπάθεια χρήσης της ενσωματωμένης συνάρτησης sum result = sum([1, 2, 3]) # Θα προκαλέσει TypeError
Αφού ορίσετε τη μεταβλητή sum
, η ενσωματωμένη συνάρτηση sum
δεν είναι πλέον προσβάσιμη στον κώδικά σας. Η προσπάθεια χρήσης της sum
ως συνάρτησης θα προκαλέσει ένα TypeError
, καθώς το Python θα ερμηνεύσει το sum
ως την ακέραια τιμή 15 και όχι ως την ενσωματωμένη συνάρτηση.
Συστάσεις
Για να αποφεύγετε την απόκρυψη ενσωματωμένων συναρτήσεων, συνιστάται να χρησιμοποιείτε μοναδικά ονόματα για τις μεταβλητές σας ή να προσθέτετεπροθέματα/επιθέματα στα ονόματα για να διακρίνονται από τις ενσωματωμένες συναρτήσεις.
Δηλώσεις σε Καθολική Εμβέλεια (Global Scope)
Στα σενάρια (scripts) που έχετε δει μέχρι τώρα, έχουν γραφτεί κάποιες δηλώσεις εκτός συναρτήσεων, στην καθολική εμβέλεια, καθώς και κάποιες εντός μπλοκ συναρτήσεων. Οι δηλώσεις σεναρίων στην καθολική εμβέλεια εκτελούνται μόλις συναντηθούν από τον διερμηνέα (interpreter), ενώ οι δηλώσεις μέσα σε ένα μπλοκ εκτελούνται μόνο όταν κληθεί η συνάρτηση.
Παράδειγμα
Για παράδειγμα:
# Καθολική εμβέλεια print("Αυτό εκτελείται αμέσως.") def demo_function(): # Εμβέλεια εντός συνάρτησης print("Αυτό εκτελείται όταν κληθεί η συνάρτηση.") # Κλήση της συνάρτησης demo_function()
Σε αυτό το παράδειγμα, η εντολή print("Αυτό εκτελείται αμέσως.")
εκτελείται αμέσως, επειδή βρίσκεται στην καθολική εμβέλεια. Η εντολή print("Αυτό εκτελείται όταν κληθεί η συνάρτηση.")
εντός της demo_function
, από την άλλη πλευρά, εκτελείται μόνο όταν η συνάρτηση demo_function()
κληθεί.
Σημασία
Η κατανόηση της διαφοράς ανάμεσα στην καθολική και την τοπική εμβέλεια είναι σημαντική για τον σωστό σχεδιασμό και την δομή των προγραμμάτων σας στην Python. Στην καθολική εμβέλεια, οι δηλώσεις εκτελούνται κατά τη φόρτωση του σεναρίου, ενώ στην τοπική εμβέλεια, οι δηλώσεις εκτελούνται μόνο όταν κληθεί η συγκεκριμένη συνάρτηση.