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

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post antar2 Python 2 07-17-2008 09:19 AM bahoo Python 3 04-03-2007 07:37 PM yomgui Python 6 07-31-2006 07:28 PM =?UTF-8?B?w4FuZ2VsIEd1dGnDqXJyZXogUm9kcsOtZ3Vleg==?= Python 5 05-15-2006 11:47 AM Sherm Pendley Perl Misc 11 06-28-2005 04:45 PM