Pass by Reference vs. Value στην Python

Pass Reference Vs



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

Η Python υποστηρίζει την αναφορά Pass by Object

Η αναφορά pass-by-και η pass-by-value είναι αναμφισβήτητα οι δύο πιο γνωστοί και εύκολα κατανοητοί τρόποι για την παράμετρο που περνά μεταξύ των γλωσσών προγραμματισμού. Η Python είναι, δυστυχώς, «αναφορά από αντικείμενο-αντικείμενο», ούτε Pass by Value ούτε Pass by Reference, συχνά αποκαλείται ως Call by Object Reference, καθώς και Call by Sharing. Είναι χρήσιμο να εξετάσετε προσεκτικά την ίδια την ιδέα χωρίζοντάς την σε τμήματα, ενώ βυθίζεστε στις τεχνικές ιδιαιτερότητες της διέλευσης από την αναφορά:







Πέρασμα: αυτό σημαίνει την παροχή μιας μεθόδου με ένα όρισμα.



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



Καθώς εκχωρείτε στη μέθοδο μια αναφορά σε μια καθορισμένη μεταβλητή, η μεταβλητή στην οποία αντιστοιχεί θα επηρεαστεί ρητά από όλες τις λειτουργίες αυτής της Αναφοράς. Τώρα ας εξετάσουμε ένα παράδειγμα του πώς, στην πράξη, λειτουργεί αυτό. Σε αυτό το παράδειγμα, ορίσαμε μια μεταβλητή « θυμωμένος' έχοντας αξία του 4 Το Σε όλο αυτό το σενάριο, η μεταβλητή « θυμωμένος' δεν τροποποιήθηκε στη θέση του. Η Python φαίνεται να χειρίζεται το παρεχόμενο όρισμα αντί για μια αναφορά σε μια τρέχουσα μεταβλητή ως αυτοτελή τιμή.





Αυτό σημαίνει ότι αντί για αναφορά, η Python μετακινεί τα ορίσματα κατά τιμή; Η Python μετακινεί τα ορίσματα μέσω αντιστοίχισης, οπότε ούτε με αναφορά ούτε με αξία. Η λογική είναι διπλή:



Επί του παρόντος, η παράμετρος που περνάει είναι ένας δείκτης σε ένα αντικείμενο. Ορισμένοι τύποι δεδομένων είναι μεταβλητοί και ορισμένοι δεν είναι μεταβλητοί.

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

Αναφορά Pass By Reference

Πρώτα απ 'όλα, πρέπει να καταλάβετε ότι η ίδια η μεταβλητή' mylist 'δεν είναι μια λίστα αλλά αναφέρεται σε μια λίστα με τιμές. Μπορείτε να ονομάσετε τη μεταβλητή 'mylist' ένα κοντέινερ με τιμές μέσα σε αυτό. Οι τιμές της λίστας είναι αντικείμενα. Η μεταβλητή «mylist» έχει παραδοθεί απευθείας στη συνάρτηση με το περιεχόμενό της.

Τόσο η λίστα όσο και η λίστα μου φαίνεται να είναι η ίδια μεταβλητή αποθήκευσης στο παρακάτω παράδειγμα κώδικα και έτσι εφαρμόζονται στο ίδιο αντικείμενο αποθήκευσης. Αυτός είναι ο λόγος για τον οποίο στην έξοδο, εκτυπώνει «Saeed».

Κάθε ενέργεια που γίνεται στη μεταβλητή ή την οντότητα θα αντικατοπτρίζεται αμέσως στη μέθοδο καλούντος. Η μέθοδος μπορεί να τροποποιήσει πλήρως την τιμή της μεταβλητής και να την στοχεύσει σε ένα εντελώς ξεχωριστό αντικείμενο. Όπως μπορείτε να δείτε στη λειτουργία «set_list», αλλάξαμε τα περιεχόμενα της λίστας και εκτυπώσαμε μια εντελώς νέα λίστα με το στοιχείο «Aqsa». Αυτό συμβαίνει επειδή επιστρέψαμε την τροποποιημένη λίστα και την εκτυπώσαμε στην ίδια γραμμή με τον καλούντα.

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

Περάστε από την αξία

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

Ισχύει εξίσου με τυχόν πράξεις που εκτελούνται σε μια μεταβλητή ή στην οντότητα με τη μέθοδο. Διπλότυπα μεταβλητών και αντικειμένων στο πεδίο της μεθόδου καλούντος διαχωρίζονται εντελώς για να τα συνοψίσουμε.

Pass Object by Reference

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

Ο καλών και η μέθοδος μιλούν για το ίδιο αντικείμενο στον αποθηκευτικό χώρο, αλλά όταν η προσαρτημένη μέθοδος εφαρμόζει ένα εξωτερικό στοιχείο σε μια λίστα, η οντότητα καλούντος τροποποιείται. Έχουν πολλές ετικέτες, αλλά είναι τα ίδια πράγματα. Και οι δύο μεταβλητές έχουν ένα πολύ παρόμοιο αντικείμενο. Αυτή είναι η αίσθηση από πίσω η σχέση της με την κίνηση από το αντικείμενο. Στο χώρο αποθήκευσης, η μέθοδος και ο καλών χρησιμοποιούν ένα παρόμοιο αντικείμενο, αλλά τους εντοπίζουν μέσω πολλαπλών μεταβλητών. Η μεταβλητή καλούντος (το εμπορευματοκιβώτιο) δεν θα αλλάξει με τυχόν τροποποιήσεις στη μεταβλητή μεθόδου (το κοντέινερ). τροποποιούνται μόνο τα δεδομένα ή το περιεχόμενο.

συμπέρασμα

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