[Tutor] modifying lists of lists
eryksun
eryksun at gmail.com
Thu Oct 4 19:17:54 CEST 2012
On Thu, Oct 4, 2012 at 7:21 AM, Dave Angel <d at davea.name> wrote:
>
> 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.
>>> H = [[1, 2]]
Copy the list [1,2] at H[0] and nest it in a list:
>>> J = [H[0][:]]
>>> J
[[1, 2]]
Modify the original list:
>>> H[0][1] = H[0][0]
>>> H
[[1, 1]]
The copy is unchanged:
>>> J
[[1, 2]]
Seems OK to me. Then I switched to the Ed's original problem. This
problem no longer uses another named list (J in the above), but it's
similar. Here's H:
>>> H = [[(0, 1), (2, 3)], [(1, 2), (3, 4)]]
The problem is to insert a copy of list H[0] at index 1 of H. At a
minimum it has to be shallow copied because later Ed wants to modify
it (i.e. H[1].pop(1)) without affecting H[0]. Copying H up to index 1
would preserve an undesired nested structure, so you'd have to
subscript, but then the subscripted value would be the original H[0]
list. You actually have to copy H[0], either by slicing with H[0][:],
or calling the list constructor with list(H[0]), or using
copy.copy(H[0]).
More information about the Tutor
mailing list