decouple copy of a list

D

Dirk Nachbar

I want to take a copy of a list a

b=a

and then do things with b which don't affect a.

How can I do this?

Dirk
 
K

Kushal Kumaran

I want to take a copy of a list a

b=a

and then do things with b which don't affect a.

How can I do this?

b = a[:] will create a copy of the list. If the elements of the list
are references to mutable objects (objects of your own classes, for
example), you might take a look at copy.deepcopy.
 
J

Jean-Michel Pichavant

Dirk said:
I want to take a copy of a list a

b=a

and then do things with b which don't affect a.

How can I do this?

Dirk
In [1]: a = [1,2,3]

In [2]: b = a[:]

In [3]: b[0] = 5

In [4]: a
Out[4]: [1, 2, 3]

In [5]: b
Out[5]: [5, 2, 3]


Alternatively, you can write

import copy
a = [1,2,3]
b = a.copy()

if the list a contains mutable objects, use copy.deepcopy
(http://docs.python.org/library/copy.html)


JM
 
W

Wolfgang Rohdewald


I did that but then some things I do with b happen to a as
well.

as others said, this is no deep copy. So if you do something
to an element in b, and if the same element is in a, both
are changed as they are still the same objects:
x,y=5,6
a=[x,y]
b=a[:]
id(a),id(b) (140695481867368, 140695481867512)
id(a[0]),id(b[0]) (33530584, 33530584)
a=b
id(a),id(b)
(140695481867512, 140695481867512)
 
C

cassiope

Dirk said:
I want to take a copy of a list a

and then do things with b which don't affect a.
How can I do this?

In [1]: a = [1,2,3]

In [2]: b = a[:]

In [3]: b[0] = 5

In [4]: a
Out[4]: [1, 2, 3]

In [5]: b
Out[5]: [5, 2, 3]

Alternatively, you can write

import copy
a = [1,2,3]
b = a.copy()

if the list a contains mutable objects, use copy.deepcopy
(http://docs.python.org/library/copy.html)

JM

I'm not a pyguru, but... you didn't use copy quite right.
Try instead: b= copy.copy(a)

The other issue that the original person has noticed is that
a list may include a reference to something. When a list is
copied - if the reference is copied (not "deepcopied"], changes
to the referred object will be visible in both lists, even if
they are different lists.

For more information, refer to the docs in the <copy> module.

HTH...
 
N

nn

I want to take a copy of a list a

b=a

and then do things with b which don't affect a.

How can I do this?

Dirk

Not knowing the particulars,
you may have to use:

import copy
b=copy.deepcopy(a)
 
J

Jean-Michel Pichavant

cassiope said:
Alternatively, you can write

import copy
a = [1,2,3]
b = a.copy()


JM

I'm not a pyguru, but... you didn't use copy quite right.
Try instead: b= copy.copy(a)
You're right, you're not a python guru so don't even try to contradict
me ever again.

....

:D of course I did it completly wrong. I don't know what happened in my
brain at that time, maybe nothing and that's the point.

JM
 

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

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,164
Latest member
quinoxflush
Top