Περισσότερα
Πώς να κλωνοποιήσετε ή να αντιγράψετε μια λίστα;
Ποιες είναι οι επιλογές για να κλωνοποιήσετε ή να αντιγράψετε μια λίστα στην Python;
Κατά τη χρήση της new_list = my_list
, οποιαδήποτε τροποποίηση στη new_list
αλλάζει κάθε φορά τη my_list
.
Γιατί συμβαίνει αυτό;
2262
3
Με την
new_list = my_list
, δεν έχετε στην πραγματικότητα δύο λίστες. Η ανάθεση απλώς αντιγράφει την αναφορά στη λίστα, όχι την πραγματική λίστα, οπότε τόσο ηnew_list
όσο και ηmy_list
αναφέρονται στην ίδια λίστα μετά την ανάθεση.Για να αντιγράψετε πραγματικά τη λίστα, έχετε διάφορες δυνατότητες:
Μπορείτε να χρησιμοποιήσετε την ενσωματωμένη μέθοδο
list.copy()
(διαθέσιμη από την Python 3.3):Μπορείτε να την τεμαχίσετε:
Η γνώμη του [Alex Martelli's][1] (τουλάχιστον [πίσω στο 2007][2]) σχετικά με αυτό είναι, ότι είναι ένα περίεργο συντακτικό και δεν έχει νόημα να το χρησιμοποιείτε ποτέ. ;) (Κατά τη γνώμη του, το επόμενο είναι πιο ευανάγνωστο).
Μπορείτε να χρησιμοποιήσετε την ενσωματωμένη συνάρτηση [
list()
][3]:Μπορείτε να χρησιμοποιήσετε τη γενική συνάρτηση [
copy.copy()
][4]:Αυτό είναι λίγο πιο αργό από την
list()
επειδή πρέπει πρώτα να βρει τον τύπο δεδομένων τηςold_list
.Αν η λίστα περιέχει αντικείμενα και θέλετε να τα αντιγράψετε και αυτά, χρησιμοποιήστε το γενικό [
copy.deepcopy()
][5]:Προφανώς η πιο αργή και πιο μνημοβόρα μέθοδος, αλλά μερικές φορές αναπόφευκτη.
Παράδειγμα:
Αποτέλεσμα:
[1]: https://en.wikipedia.org/wiki/Alex_Martelli "Alex Martelli", [2]: https://www.youtube.com/watch?v=g7V89K8QfgQ "Bay Area Python Interest Group August 2007 Meeting", [3]: https://docs.python.org/2/library/functions.html#list "list", [4]: https://docs.python.org/2/library/copy.html#copy.copy "copy.copy", [5]: https://docs.python.org/2/library/copy.html#copy.deepcopy "copy.deepcopy",
Χρήση
thing[:]
Ο ιδιωματισμός της Python για να γίνει αυτό είναι
newList = oldList[:]