Quali sono le opzioni per clonare o copiare una lista in Python?
Mentre si usa new_list = my_list
, qualsiasi modifica a new_list
cambia my_list
ogni volta.
Perché questo?
Con new_list = my_list
, in realtà non hai due liste. L'assegnazione copia solo il riferimento alla lista, non la lista vera e propria, quindi sia new_list
che my_list
si riferiscono alla stessa lista dopo l'assegnazione.
Per copiare effettivamente la lista, hai varie possibilità:
Potete usare il metodo integrato list.copy()
(disponibile da Python 3.3):
new_list = old_list.copy()
Potete affettarlo:
new_list = old_list[:]
L'opinione di Alex Martelli's (almeno [nel 2007][2]) su questo è che è una sintassi strana e non ha senso usarla mai. ;) (Secondo lui, il successivo è più leggibile).
Puoi usare la funzione integrata list()
:
new_list = list(old_list)
Potete usare il generico copy.copy()
:
importare copia
new_list = copy.copy(old_list)
Questo è un po' più lento di list()
perché deve prima scoprire il tipo di dati di vecchio_list
.
Se la lista contiene oggetti e volete copiare anche quelli, usate il generico copy.deepcopy()
:
importa copy
new_list = copy.deepcopy(old_list)
Ovviamente il metodo più lento e che richiede più memoria, ma a volte inevitabile.
Esempio:
import copy
class Foo(object):
def __init__(self, val):
self.val = val
def __repr__(self):
return str(self.val)
foo = Foo(1)
a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)
# edit orignal list and instance
a.append('baz')
foo.val = 5
print('original: %r\n list.copy(): %r\n slice: %r\n list(): %r\n copy: %r\n deepcopy: %r'
% (a, b, c, d, e, f))
Risultato:
original: ['foo', 5, 'baz']
list.copy(): ['foo', 5]
slice: ['foo', 5]
list(): ['foo', 5]
copy: ['foo', 5]
deepcopy: ['foo', 1]