Velocity Reviews > Duplicating list of lists [newbie]

# Duplicating list of lists [newbie]

yatsek@gmail.com
Guest
Posts: n/a

 03-23-2008
Hi there.
I felt like I already know my toys around but it looks that I'm still
newbie on some points.

So here goes problem:

Lets say that we have list to copy:

a = [1,2,3]
b = a[:]
a[0] = 5

a
> [5,2,3]

b
>[1,2,3]

So far so good

But... let's say that "a" also contains lists:

a = [1,2,[5,6,7]]
b = a[:]

a[0] = 55
a
> [55,2,[5,6,7]]

b
> [1,2,[5,6,7]]

Looks OK but...

a[2][0] = 99
a
> [55,2,[99,6,7]]

b
> [1,2,[99,6,7]]

So - it looks that in list "b" there copy of all objects from list "a"
including not copy of list [5,6,7] but reference to it.

Is there simple way to copy a into b (like a[:]) with all copies of
all objects going as deep as possible? Or it can be done only
manually?

Regards
Yatsek

George Sakkis
Guest
Posts: n/a

 03-23-2008
On Mar 23, 11:34 am, (E-Mail Removed) wrote:
> Hi there.
> I felt like I already know my toys around but it looks that I'm still
> newbie on some points.
>
> So here goes problem:
>
> Lets say that we have list to copy:
>
> a = [1,2,3]
> b = a[:]
> a[0] = 5
>
> a
>
> > [5,2,3]

> b
> >[1,2,3]

>
> So far so good
>
> But... let's say that "a" also contains lists:
>
> a = [1,2,[5,6,7]]
> b = a[:]
>
> a[0] = 55
> a
>
> > [55,2,[5,6,7]]

> b
> > [1,2,[5,6,7]]

>
> Looks OK but...
>
> a[2][0] = 99
> a
>
> > [55,2,[99,6,7]]

> b
> > [1,2,[99,6,7]]

>
> So - it looks that in list "b" there copy of all objects from list "a"
> including not copy of list [5,6,7] but reference to it.

Right; that's what it's called a "shallow copy".

> Is there simple way to copy a into b (like a[:]) with all copies of
> all objects going as deep as possible?

Yes, there is:

from copy import deepcopy
b = deepcopy(a)

HTH,
George

Ryan Ginstrom
Guest
Posts: n/a

 03-23-2008
> On Behalf Of http://www.velocityreviews.com/forums/(E-Mail Removed)
> So - it looks that in list "b" there copy of all objects from list "a"
> including not copy of list [5,6,7] but reference to it.
>
> Is there simple way to copy a into b (like a[:]) with all
> copies of all objects going as deep as possible? Or it can be
> done only manually?

I'd suggest checking out copy.deepcopy.

>>> a = [1, [1, 2, 3], 2]
>>> b = a[:]
>>> a[1][2] = 'spam'
>>> b

[1, [1, 2, 'spam'], 2]
>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a[1][2] = 'deepcopy is your friend'
>>> b

[1, [1, 2, 'spam'], 2]

Regards,
Ryan Ginstrom

bearophileHUGS@lycos.com
Guest
Posts: n/a

 03-23-2008
Yatsek:
> Is there simple way to copy a into b (like a[:]) with all copies of
> all objects going as deep as possible?

If you only want to copy up to level-2, then you can do something
like:
cloned = [subl[:] for subl in somelist]
Or sometimes safer:
cloned =[list(subl) for subl in somelist]

If you want to go all the way down, you can use the deepcopy function
of the copy module. In many situations the level-2 copy may be enough,
and it can be faster.

Bye,
bearophile