Duplicating list of lists [newbie]

Y

yatsek

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
 
G

George Sakkis

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
 
R

Ryan Ginstrom

On Behalf Of (e-mail address 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
 
B

bearophileHUGS

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top