[Tutor] modifying lists of lists
Dave Angel
d at davea.name
Thu Oct 4 13:21:56 CEST 2012
On 10/03/2012 11:52 PM, Ed Owens wrote:
> You are fundamentally correct about my confusion, though I'm trying to work
> with tuples as the lowest level, which may not be relevant here.
The tuples are an example of an immutable object. An immutable object
(which contains only immutable objects) may be safely shared without
risk of the kind of problem you're having. ints would have worked just
as well.
Eryksun is almost correct, but I'm going to attempt to show you how to
figure it out for yourself, next time.
>
> -----Original Message-----
> .
>
> py> H = [[1, 2]]
> py> J = [H[0]]
> py> print H
> [[1, 2]]
> py> print J
> [[1, 2]]
Here, if you print id(H[0]) and id(J[0]) you'll see they're the same.
You've already shown they're lists, and therefore mutable. Thus, you
have a risk. H and J are different lists, each containing the same list
as their content. Also try
>>> H is J
False
>>> H[0] is J[0]
True
>>>
Now, if we go one more level down, to H[0][0], we'll see a tuple. And
although they're also identical, there's no problem there.
This is how eryksun knew that a shallow copy was good enough. And for a
shallow copy, using the slice notation is perfect.
>>> J42 = [H[:1]]
>>> print J42[0]
[(1, 2)]
>>> print id(J42[0])
13964568
(Note that my shallow copy is not quite what eryksun was using. His
lost one level of the nesting, by doing both the subscript and the slice.)
Now, since the id is different, you won't get the problem you saw first.
--
DaveA
More information about the Tutor
mailing list