Duplicating a variable

bearophileHUGS at lycos.com bearophileHUGS at lycos.com
Thu Jan 24 12:55:46 EST 2008


Hans:
> I have run into a bit of a subtle problem.  How do I go about
> duplicating a variable (particularly a list of lists) in python.  I
> was surprised when simple assignment didn't work.

Python is quite high-level language, but now and then it too accepts
some compromises to increase its speed/size performance. Probably
after Python  someone will invent a language that may be slower than
Python because it's higher level than Python, and avoids that problem
you talk about (and other things). (And with a strategy of smart data
sharing and copy-on-write the interpreter can avoid part of that
overhead).


> how do I go about duplicating a variable
> which I can then manipulate independently?

If your variable contains a list, then you can copy it like this:

>>> l1 = [1, 2, 3]
>>> l2 = l1[:]
>>> l2[1] = 4

As you can see now they are two distinct lists:

>>> l1
[1, 2, 3]
>>> l2
[1, 4, 3]

If you want to copy any kind of object you can use the copy function
(instead of a simpler copy method that's absent):

>>> d1 = {1:2, 3:4}
>>> from copy import copy
>>> d2 = copy(d1)
>>> d1[1] = 5
>>> d1
{1: 5, 3: 4}
>>> d2
{1: 2, 3: 4}

But as you can see copy works only one level deep:

>>> d3 = {1:[1], 3:4}
>>> d3
{1: [1], 3: 4}
>>> d4 = copy(d3)
>>> d3[1][0] = 2
>>> d3
{1: [2], 3: 4}
>>> d4
{1: [2], 3: 4}

To copy all levels you need deepcopy:

>>> from copy import deepcopy
>>> d5 = deepcopy(d3)
>>> d3[1][0] = 5
>>> d3
{1: [5], 3: 4}
>>> d4
{1: [5], 3: 4}
>>> d5
{1: [2], 3: 4}

Bye,
bearophile



More information about the Python-list mailing list