Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

4.6 Πέρασμα Ορισμάτων σε Συναρτήσεις: Μια Βαθύτερη Ματιά

Μεταβίβαση Ορισμάτων σε Συναρτήσεις στην Python

Η διαδικασία μεταβίβασης ορισμάτων στις συναρτήσεις στην Python έχει ιδιαίτερες χαρακτηριστικές ιδιότητες. Αν και σε πολλές γλώσσες προγραμματισμού υπάρχουν δύο βασικοί τρόποι μεταβίβασης ορισμάτων – pass-by-value και pass-by-reference – στην Python τα ορίσματα μεταβιβάζονται πάντα μέσω αναφοράς.

Μεταβίβαση Αναφοράς στην Python

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

Παράδειγμα Μεταβίβασης Αναφοράς

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def modify_list(lst):
lst.append(4) # Προσθέτει ένα στοιχείο στην αρχική λίστα
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # Εκτυπώνει [1, 2, 3, 4]
def modify_list(lst): lst.append(4) # Προσθέτει ένα στοιχείο στην αρχική λίστα my_list = [1, 2, 3] modify_list(my_list) print(my_list) # Εκτυπώνει [1, 2, 3, 4]
def modify_list(lst):
    lst.append(4)  # Προσθέτει ένα στοιχείο στην αρχική λίστα

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # Εκτυπώνει [1, 2, 3, 4]

Σε αυτό το παράδειγμα, η αλλαγή που γίνεται στη λίστα εντός της συνάρτησης modify_list επηρεάζει άμεσα τη λίστα my_list εκτός της συνάρτησης, επειδή της περνάμε την αναφορά της.

Σημασία για την Απόδοση

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

Διευθύνσεις Μνήμης, Αναφορές και “Δείκτες” στον Προγραμματισμό

Η αλληλεπίδραση με ένα αντικείμενο στον προγραμματισμό γίνεται μέσω μιας αναφοράς, η οποία στο παρασκήνιο είναι η διεύθυνση (ή η τοποθεσία) του αντικειμένου στη μνήμη του υπολογιστή. Σε άλλες γλώσσες προγραμματισμού, αυτό μπορεί να αναφέρεται ως “δείκτης” (pointer).

Αναφορές και Διευθύνσεις Μνήμης

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
x = 7
x = 7
x = 7

η μεταβλητή x δεν περιέχει κυριολεκτικά την τιμή 7. Αντίθετα, περιέχει μια αναφορά σε ένα αντικείμενο που αποθηκεύει την τιμή 7 κάπου αλλού στη μνήμη. Μπορείτε να πείτε ότι η x “δείχνει προς” ή “αναφέρεται σε” το αντικείμενο που περιέχει το 7.

Εικονική Απεικόνιση

Σε μια εικονική απεικόνιση, μπορείτε να φανταστείτε ότι η x είναι ένα είδος δείκτη που δείχνει στη διεύθυνση μνήμης όπου είναι αποθηκευμένο το αντικείμενο με την τιμή 7.

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

Ενσωματωμένη Συνάρτηση id και Ταυτότητες Αντικειμένων στην Python

Στην Python, κάθε αντικείμενο στη μνήμη έχει μια μοναδική ταυτότητα, η οποία μπορεί να ανακτηθεί μέσω της ενσωματωμένης συνάρτησης id. Αυτή η ταυτότητα αντιπροσωπεύει ένα μοναδικό ακέραιο αριθμό που ταυτίζει το αντικείμενο όσο παραμένει στη μνήμη. Δύο διαφορετικά αντικείμενα δεν μπορούν να έχουν την ίδια ταυτότητα.

Χρήση της Συνάρτησης id

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

Παράδειγμα Χρήσης της id

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
x = 7
print(id(x)) # Εκτυπώνει τη μοναδική ταυτότητα του αντικειμένου που περιέχει το 7
x = 7 print(id(x)) # Εκτυπώνει τη μοναδική ταυτότητα του αντικειμένου που περιέχει το 7
x = 7
print(id(x))  # Εκτυπώνει τη μοναδική ταυτότητα του αντικειμένου που περιέχει το 7

Σε αυτό το παράδειγμα, η μεταβλητή x αναφέρεται στο αντικείμενο που περιέχει τον αριθμό 7. Η συνάρτηση id(x) επιστρέφει έναν μοναδικό ακέραιο που αναγνωρίζει αυτό το αντικείμενο στη μνήμη.

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

Όταν μεταβιβάζετε ένα αντικείμενο σε μια συνάρτηση στην Python, μεταφέρετε την αναφορά σε αυτό το αντικείμενο. Ας δούμε ένα παράδειγμα με μια συνάρτηση που υπολογίζει τον κύβο ενός αριθμού και εμφανίζει την ταυτότητα του αντικειμένου παραμέτρου.

Παράδειγμα: Μεταβίβαση Αντικειμένου σε Συνάρτηση

Ας ορίσουμε πρώτα τη συνάρτηση cube:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def cube(number):
print(f"Ταυτότητα αντικειμένου number: {id(number)}")
return number ** 3
x = 7
print(f"Ταυτότητα αντικειμένου x: {id(x)}")
result = cube(x)
print(f"Το αποτέλεσμα είναι: {result}")
def cube(number): print(f"Ταυτότητα αντικειμένου number: {id(number)}") return number ** 3 x = 7 print(f"Ταυτότητα αντικειμένου x: {id(x)}") result = cube(x) print(f"Το αποτέλεσμα είναι: {result}")
def cube(number):
    print(f"Ταυτότητα αντικειμένου number: {id(number)}")
    return number ** 3

x = 7
print(f"Ταυτότητα αντικειμένου x: {id(x)}")

result = cube(x)
print(f"Το αποτέλεσμα είναι: {result}")

Σε αυτό το παράδειγμα:

  1. Δημιουργούμε τη μεταβλητή x με τιμή 7 και εκτυπώνουμε την ταυτότητά της.
  2. Καλούμε τη συνάρτηση cube με το όρισμα x.
  3. Μέσα στη συνάρτηση cube, εμφανίζουμε την ταυτότητα της παραμέτρου number.
  4. Επιστρέφουμε τον κύβο της τιμής της παραμέτρου.

Θα παρατηρήσετε ότι οι ταυτότητες της x και της παραμέτρου number είναι ίδιες, πράγμα που δείχνει ότι και τα δύο αναφέρονται στο ίδιο αντικείμενο στη μνήμη. Αυτό σημαίνει ότι όταν η συνάρτηση cube χρησιμοποιεί την παράμετρο number στον υπολογισμό της, χρησιμοποιεί την τιμή του αρχικού αντικειμένου που δόθηκε ως όρισμα.

Δοκιμή Ταυτοτήτων Αντικειμένων με τον Τελεστή is στην Python

Ο τελεστής is στην Python χρησιμοποιείται για να δοκιμάσετε εάν δύο μεταβλητές αναφέρονται στο ίδιο αντικείμενο, δηλαδή εάν έχουν την ίδια ταυτότητα. Αν οι δύο μεταβλητές αναφέρονται στο ίδιο αντικείμενο, ο τελεστής is επιστρέφει True.

Παράδειγμα: Χρήση του Τελεστή is

Ας δούμε πώς μπορούμε να χρησιμοποιήσουμε τον τελεστή is για να επαληθεύσουμε ότι δύο μεταβλητές αναφέρονται στο ίδιο αντικείμενο:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
x = 7
y = x # y αναφέρεται στο ίδιο αντικείμενο με το x
# Έλεγχος εάν x και y αναφέρονται στο ίδιο αντικείμενο
print(x is y) # Εκτυπώνει True
x = 7 y = x # y αναφέρεται στο ίδιο αντικείμενο με το x # Έλεγχος εάν x και y αναφέρονται στο ίδιο αντικείμενο print(x is y) # Εκτυπώνει True
x = 7
y = x  # y αναφέρεται στο ίδιο αντικείμενο με το x

# Έλεγχος εάν x και y αναφέρονται στο ίδιο αντικείμενο
print(x is y)  # Εκτυπώνει True

Στο παράδειγμα αυτό, αφού η y έχει ανατεθεί στην ίδια τιμή με την x, αναφέρεται στο ίδιο αντικείμενο στη μνήμη. Έτσι, η σύγκριση x is y επιστρέφει True.

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

Αμετάβλητα Αντικείμενα ως Ορίσματα στις Συναρτήσεις

Όταν μια συνάρτηση λαμβάνει ως όρισμα την αναφορά σε ένα αμετάβλητο (δηλαδή αμετάβλητο) αντικείμενο, όπως ένας ακέραιος (int), ένας δεκαδικός (float), μια συμβολοσειρά (string) ή μια πλειάδα (tuple), αν και έχετε άμεση πρόσβαση στο αρχικό αντικείμενο στην κλήση, δεν μπορείτε να τροποποιήσετε την τιμή του αρχικού αμετάβλητου αντικειμένου.

Για να αποδείξουμε αυτό, ας δούμε πώς η συνάρτηση cube μπορεί να εμφανίσει την ταυτότητα της παραμέτρου number πριν και μετά την ανάθεση ενός νέου αντικειμένου στην παράμετρο number μέσω μιας αυξημένης ανάθεσης:

Παράδειγμα με Αμετάβλητο Όρισμα

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def cube(number):
print(f"Ταυτότητα πριν την αυξημένη ανάθεση: {id(number)}")
number **= 3 # Αυξημένη ανάθεση
print(f"Ταυτότητα μετά την αυξημένη ανάθεση: {id(number)}")
return number
x = 7
print(f"Ταυτότητα του x πριν την κλήση της συνάρτησης: {id(x)}")
result = cube(x)
print(f"Ταυτότητα του x μετά την κλήση της συνάρτησης: {id(x)}")
print(f"Το αποτέλεσμα είναι: {result}")
def cube(number): print(f"Ταυτότητα πριν την αυξημένη ανάθεση: {id(number)}") number **= 3 # Αυξημένη ανάθεση print(f"Ταυτότητα μετά την αυξημένη ανάθεση: {id(number)}") return number x = 7 print(f"Ταυτότητα του x πριν την κλήση της συνάρτησης: {id(x)}") result = cube(x) print(f"Ταυτότητα του x μετά την κλήση της συνάρτησης: {id(x)}") print(f"Το αποτέλεσμα είναι: {result}")
def cube(number):
    print(f"Ταυτότητα πριν την αυξημένη ανάθεση: {id(number)}")
    number **= 3  # Αυξημένη ανάθεση
    print(f"Ταυτότητα μετά την αυξημένη ανάθεση: {id(number)}")
    return number

x = 7
print(f"Ταυτότητα του x πριν την κλήση της συνάρτησης: {id(x)}")
result = cube(x)
print(f"Ταυτότητα του x μετά την κλήση της συνάρτησης: {id(x)}")
print(f"Το αποτέλεσμα είναι: {result}")

Στο παράδειγμα αυτό:

  1. Αναθέτουμε στην x την τιμή 7 και εμφανίζουμε την ταυτότητά της.
  2. Καλούμε τη συνάρτηση cube με το όρισμα x.
  3. Μέσα στη συνάρτηση cube, εμφανίζουμε την ταυτότητα της παραμέτρου number πριν και μετά την αυξημένη ανάθεση.
  4. Επιστρέφουμε τον κύβο της τιμής της παραμέτρου.

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

11 Ιανουαρίου, 2024
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων