Κατανόηση της ρηχής και βαθιάς αντιγραφής στην Python

Κατανόηση της ρηχής και βαθιάς αντιγραφής στην Python
Αναγνώστες σαν εσάς βοηθούν στην υποστήριξη του MUO. Όταν κάνετε μια αγορά χρησιμοποιώντας συνδέσμους στον ιστότοπό μας, ενδέχεται να κερδίσουμε μια προμήθεια θυγατρικών. Διαβάστε περισσότερα.

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





MUO Το βίντεο της ημέρας ΚΥΛΙΣΤΕ ΓΙΑ ΝΑ ΣΥΝΕΧΙΣΕΤΕ ΜΕ ΠΕΡΙΕΧΟΜΕΝΟ

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





Χρήση ρηχής αντιγραφής

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





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

Εξετάστε ένα παράδειγμα του εργασία με λίστα ή λεξικό στην Python .



καλύτερες δωρεάν εφαρμογές vr για android
import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

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

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





  αλλαγές στην ένθετη λίστα ρηχών αντιγράφων

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

import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Η έξοδος δείχνει ότι και τα δύο εξωτερικά στοιχεία της λίστας είναι ανεξάρτητα μεταξύ τους:





  αλλαγές σε εξωτερικά στοιχεία ρηχού αντιγράφου

Η ίδια ιδέα ισχύει και όταν εργάζεστε με λεξικά.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}} 
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Αλλαγές που έγιναν στο ένθετο λεξικό του dict1 επηρεάζουν και τα δύο dict1 και dict2 . Ταυτόχρονα, αλλαγές στα εξωτερικά στοιχεία του dict1 επηρεάζουν μόνο αυτό.

  χρησιμοποιώντας ρηχό αντίγραφο με ένθετο λεξικό

Χρήση Deep Copy

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

Για να δημιουργήσετε ένα βαθύ αντίγραφο στην Python, χρησιμοποιήστε το deepcopy() λειτουργία της μονάδας αντιγραφής.

Εξετάστε ένα παράδειγμα εργασίας με μια λίστα.

import copy 

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Εδώ, ο κώδικας εκτελεί ένα βαθύ αντίγραφο του κύρια_λίστα , δημιουργώντας ένα ανεξάρτητο αντίγραφο με το όνομα deep_copy .

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

  χρησιμοποιώντας βαθιά αντιγραφή με ένθετη λίστα

Εργασία με προσαρμοσμένα αντικείμενα

Μπορείτε να δημιουργήσετε ένα προσαρμοσμένο αντικείμενο από ορίζοντας μια κλάση Python και δημιουργία ενός στιγμιότυπου της τάξης.

Ακολουθεί ένα παράδειγμα δημιουργίας απλού αντικειμένου από a Βιβλίο τάξη:

classBook: 
    def__init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def__str__(self):
        returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

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

import copy 

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Όπως μπορείτε να δείτε, το ρηχό αντίγραφο ( βιβλίο 2 ) είναι ένα νέο αντικείμενο, αλλά αναφέρεται στο ίδιο εσωτερικό αντικείμενο (λίστα συγγραφέων) με το αρχικό αντικείμενο ( βιβλίο 1 ). Ως εκ τούτου, μια αλλαγή στους συγγραφείς του αρχικού αντικειμένου επηρεάζει και τις δύο περιπτώσεις (βιβλίο1 και βιβλίο2), ενώ μια αλλαγή στο εξωτερικό στοιχείο ( τιμή ) επηρεάζει μόνο το αρχικό αντικείμενο ( βιβλίο 1 ).

  χρησιμοποιώντας ρηχό αντίγραφο με προσαρμοσμένο αντικείμενο

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

γιατί αργεί να φορτίσει το τηλέφωνό μου
# Create a Book object 
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

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

  χρήση αντιγραφής σε βάθος με προσαρμοσμένο αντικείμενο

Χρήσεις για ρηχή και βαθιά αντιγραφή

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

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

Απόδοση και Θεωρήσεις

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

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

Η καλύτερη επιλογή αντιγραφής για τα δεδομένα σας

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

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