Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to copy a list? [duplicate]

Tags:

python

What is the best way to copy a list? I know the following ways, which one is better? Or is there another way?

lst = ['one', 2, 3]  lst1 = list(lst)  lst2 = lst[:]  import copy lst3 = copy.copy(lst) 
like image 817
sheats Avatar asked Oct 08 '08 20:10

sheats


2 Answers

If you want a shallow copy (elements aren't copied) use:

lst2=lst1[:] 

If you want to make a deep copy then use the copy module:

import copy lst2=copy.deepcopy(lst1) 
like image 130
Mark Roddy Avatar answered Sep 17 '22 22:09

Mark Roddy


I often use:

lst2 = lst1 * 1 

If lst1 it contains other containers (like other lists) you should use deepcopy from the copy lib as shown by Mark.


UPDATE: Explaining deepcopy

>>> a = range(5) >>> b = a*1 >>> a,b ([0, 1, 2, 3, 4], [0, 1, 2, 3, 4]) >>> a[2] = 55  >>> a,b ([0, 1, 55, 3, 4], [0, 1, 2, 3, 4]) 

As you may see only a changed... I'll try now with a list of lists

>>>  >>> a = [range(i,i+3) for i in range(3)] >>> a [[0, 1, 2], [1, 2, 3], [2, 3, 4]] >>> b = a*1 >>> a,b ([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]]) 

Not so readable, let me print it with a for:

>>> for i in (a,b): print i    [[0, 1, 2], [1, 2, 3], [2, 3, 4]] [[0, 1, 2], [1, 2, 3], [2, 3, 4]] >>> a[1].append('appended') >>> for i in (a,b): print i  [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] 

You see that? It appended to the b[1] too, so b[1] and a[1] are the very same object. Now try it with deepcopy

>>> from copy import deepcopy >>> b = deepcopy(a) >>> a[0].append('again...') >>> for i in (a,b): print i  [[0, 1, 2, 'again...'], [1, 2, 3, 'appended'], [2, 3, 4]] [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] 
like image 22
Andrea Ambu Avatar answered Sep 18 '22 22:09

Andrea Ambu