2010-03-29 1 views
19

Ciao Voglio copiare un elenco 2D, in modo che se modifico 1 elenco, l'altro non viene modificato.Copia elenchi 2D in python

Per 1 elenco D, io faccio solo questo:

a = [1,2] 
b = a[:] 

E ora se modifico b, a non viene modificato.

Ma questo non funziona per la lista 2D:

a = [[1,2],[3,4]] 
b = a[:] 

Se modifico b, a viene modificato pure.

Come posso risolvere questo problema?

+3

Un sacco di tempo in cui la gente utente nidificato liste e la necessità di copiarli in questo modo, vogliono davvero usare 'numpy'. –

risposta

34

Per una soluzione più generale che funziona a prescindere dal numero di dimensioni, utilizzare copy.deepcopy():

import copy 
b = copy.deepcopy(a) 
+0

Anche se nella maggior parte dei casi, probabilmente direi copia import deepcopy' dato che un conflitto di nomi è improbabile e sembra più bello. ;) – Amber

+1

@Dav, si effettua un punto valido. Preferisco importare sempre i moduli al fine di evitare conflitti tra nomi invece di gestire le funzioni caso per caso. :) –

+0

Si noti che questo farà anche una copia profonda degli elementi effettivi negli elenchi. – FogleBird

35
b = [x[:] for x in a] 
+4

+1 poiché appropriato. Personalmente, mi piace evitare la copia/deepcopy (molto raramente ha avuto un caso d'uso valido per loro nella vita reale, lo stesso si può dire per una lista con più di 2 dimensioni imo) – ChristopheD