Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: Append a list to another list and Clear the first list

Tags:

python

list

So this just blew my mind. I am working on a python code where I create a list, append it to a master list and clear the first list to add some more elements to it. When I clear the first list, even the master list gets cleared. I worked on a lot of list appends and clears but never observed this.

list1 = []
list2 = []
list1 = [1,2,3]
list2.append(list1)
list1
[1, 2, 3]
list2
[[1, 2, 3]]
del list1[:]
list1
[]
list2
[[]]

I know this happens with appending dictionaries but I did not know how to deal with lists. Can some one please elaborate?

I am using Python2.7

like image 691
kskp Avatar asked Sep 21 '16 02:09

kskp


1 Answers

Passing a list to a method like append is just passing a reference to the same list referred to by list1, so that's what gets appended to list2. They're still the same list, just referenced from two different places.

If you want to cut the tie between them, either:

  1. Insert a copy of list1, not list1 itself, e.g. list2.append(list1[:]), or
  2. Replace list1 with a fresh list after appending instead of clearing in place, changing del list1[:] to list1 = []

Note: It's a little unclear, but if you want the contents of list1 to be added to list2 (so list2 should become [1, 2, 3] not [[1, 2, 3]] with the values in the nested list), you'd want to call list2.extend(list1), not append, and in that case, no shallow copies are needed; the values from list1 at that time would be individually appended, and no further tie would exist between list1 and list2 (since the values are immutable ints; if they were mutable, say, nested lists, dicts, etc., you'd need to copy them to completely sever the tie, e.g. with copy.deepcopy for complex nested structure).

like image 106
ShadowRanger Avatar answered Nov 10 '22 00:11

ShadowRanger