Ρηχό αντίγραφο και βαθύ αντίγραφο Python (με παραδείγματα)

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

Αντιγράψτε ένα αντικείμενο στο Python

Στο Python, χρησιμοποιούμε τον =τελεστή για να δημιουργήσουμε ένα αντίγραφο ενός αντικειμένου. Μπορεί να πιστεύετε ότι δημιουργεί ένα νέο αντικείμενο. δεν το κάνει. Δημιουργεί μόνο μια νέα μεταβλητή που μοιράζεται την αναφορά του αρχικού αντικειμένου.

Ας πάρουμε ένα παράδειγμα όπου δημιουργούμε μια λίστα με την ονομασία old_list και μεταφέρουμε μια αναφορά αντικειμένου στη νέα_ λίστα χρησιμοποιώντας τον =τελεστή.

Παράδειγμα 1: Αντιγραφή χρησιμοποιώντας = χειριστή

 old_list = ((1, 2, 3), (4, 5, 6), (7, 8, 'a')) new_list = old_list new_list(2)(2) = 9 print('Old List:', old_list) print('ID of Old List:', id(old_list)) print('New List:', new_list) print('ID of New List:', id(new_list))

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

 Παλιά λίστα: ((1, 2, 3), (4, 5, 6), (7, 8, 9)) Αναγνωριστικό της παλιάς λίστας: 140673303268168 Νέα λίστα: ((1, 2, 3), (4, 5 , 6), (7, 8, 9)) Αναγνωριστικό νέας λίστας: 140673303268168

Όπως μπορείτε να δείτε από την έξοδο και οι δύο μεταβλητές old_list και new_list μοιράζονται το ίδιο αναγνωριστικό δηλαδή 140673303268168.

Έτσι, εάν θέλετε να τροποποιήσετε οποιεσδήποτε τιμές στη λίστα new_list ή old_list, η αλλαγή είναι ορατή και στα δύο.

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

  1. Ρηχό αντίγραφο
  2. Βαθύ αντίγραφο

Για να λειτουργήσουμε αυτά τα αντίγραφα, χρησιμοποιούμε τη copyλειτουργική μονάδα.

Αντιγραφή ενότητας

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

 εισαγωγή αντιγράφου copy.copy (x) copy.deepcopy (x)

Εδώ, copy()επιστρέψτε ένα ρηχό αντίγραφο του x. Ομοίως, deepcopy()επιστρέψτε ένα βαθύ αντίγραφο του x.

Ρηχό αντίγραφο

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

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

Παράδειγμα 2: Δημιουργήστε ένα αντίγραφο χρησιμοποιώντας ρηχό αντίγραφο

 import copy old_list = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) new_list = copy.copy(old_list) print("Old list:", old_list) print("New list:", new_list)

Όταν εκτελούμε το πρόγραμμα, η έξοδος θα είναι:

 Παλιά λίστα: ((1, 2, 3), (4, 5, 6), (7, 8, 9)) Νέα λίστα: ((1, 2, 3), (4, 5, 6), (7 , 8, 9))

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

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

Για να επιβεβαιώσουμε ότι το new_list είναι διαφορετικό από το old_list, προσπαθούμε να προσθέσουμε νέο ένθετο αντικείμενο στο πρωτότυπο και να το ελέγξουμε.

Παράδειγμα 3: Προσθήκη (4, 4, 4) στο old_list, χρησιμοποιώντας ρηχό αντίγραφο

 import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.copy(old_list) old_list.append((4, 4, 4)) print("Old list:", old_list) print("New list:", new_list)

Όταν εκτελούμε το πρόγραμμα, θα εξάγει:

 Παλιά λίστα: ((1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)) Νέα λίστα: ((1, 1, 1), (2 , 2, 2), (3, 3, 3))

Στο παραπάνω πρόγραμμα, δημιουργήσαμε ένα ρηχό αντίγραφο της παλιάς λίστας. Το new_list περιέχει αναφορές σε πρωτότυπα ένθετα αντικείμενα που είναι αποθηκευμένα στο old_list Στη συνέχεια, προσθέτουμε τη νέα λίστα, δηλαδή (4, 4, 4)στο old_list. Αυτή η νέα δευτερεύουσα λίστα δεν αντιγράφηκε στη νέα λίστα.

Ωστόσο, όταν αλλάζετε τυχόν ένθετα αντικείμενα στο old_list, οι αλλαγές εμφανίζονται στο new_list.

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

 import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.copy(old_list) old_list(1)(1) = 'AA' print("Old list:", old_list) print("New list:", new_list)

Όταν εκτελούμε το πρόγραμμα, θα εξάγει:

 Παλιά λίστα: ((1, 1, 1), (2, "AA", 2), (3, 3, 3)) Νέα λίστα: ((1, 1, 1), (2, "AA", 2 ), (3, 3, 3))

Στο παραπάνω πρόγραμμα, κάναμε αλλαγές στο old_list, δηλαδή old_list(1)(1) = 'AA'. Τροποποιήθηκαν και οι δύο λίστες του old_list και new_list στο ευρετήριο (1)(1). Αυτό συμβαίνει επειδή, και οι δύο λίστες μοιράζονται την αναφορά των ίδιων ένθετων αντικειμένων.

Βαθύ αντίγραφο

Ένα βαθύ αντίγραφο δημιουργεί ένα νέο αντικείμενο και προσθέτει αναδρομικά τα αντίγραφα των ένθετων αντικειμένων που υπάρχουν στα αρχικά στοιχεία.

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

Παράδειγμα 5: Αντιγραφή λίστας χρησιμοποιώντας deepcopy ()

 import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.deepcopy(old_list) print("Old list:", old_list) print("New list:", new_list)

Όταν εκτελούμε το πρόγραμμα, θα εξάγει:

 Παλιά λίστα: ((1, 1, 1), (2, 2, 2), (3, 3, 3)) Νέα λίστα: ((1, 1, 1), (2, 2, 2), (3 , 3, 3))

Στο παραπάνω πρόγραμμα, χρησιμοποιούμε τη deepcopy()λειτουργία για να δημιουργήσουμε αντίγραφο που μοιάζει παρόμοιο.

Ωστόσο, εάν κάνετε αλλαγές σε τυχόν ένθετα αντικείμενα στο αρχικό αντικείμενο old_list, δεν θα δείτε αλλαγές στην αντιγραφή new_list.

Παράδειγμα 6: Προσθήκη νέου ένθετου αντικειμένου στη λίστα με χρήση αντιγράφου σε βάθος

 import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.deepcopy(old_list) old_list(1)(0) = 'BB' print("Old list:", old_list) print("New list:", new_list)

Όταν εκτελούμε το πρόγραμμα, θα εξάγει:

 Παλιά λίστα: ((1, 1, 1), ('BB', 2, 2), (3, 3, 3)) Νέα λίστα: ((1, 1, 1), (2, 2, 2), (3, 3, 3))

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

ενδιαφέροντα άρθρα...