Python: Copy Nested List, Shallow/Deep Copy
Copying List by Reference
If you do this list_a = list_b
, that'll copy a reference. That means: modifying one list also modifies the other.
list_a = [3, 4, 5] list_b = list_a list_a[0] = 7 print(list_b ) # [7, 4, 5]
Check Equality of 2 Objects
You can check by using the “id” function. The id(obj)
returns the object's memory address.
aa = [3, 4, 5] bb = aa print(id(aa)) # 4477411144 print(id(aa) == id(bb)) # True
Copy Flat List Using List Slice
You can make a copy by list_b = list_a[:]
. When the first index are omitted, it default to 0. When the ending index is omitted, it default to length of the list.
list_a = [3,4,5] list_b = list_a[:] print(id(list_a) == id(list_b)) # False print(list_a == list_b) # True
Copy Flat List Using .extend()
list_a = [3, 4, 5] list_b = [] list_b.extend(list_a) print(id(list_a) == id(list_b)) # False print(list_a == list_b) # True
Copy Flat List Using list()
The best way to copy flat list is
lst2 = list(lst)
list_a = [3, 4, 5] list_b = list(list_a) print(id(list_a) == id(list_b)) # False print(list_a == list_b) # True
Copying Nested List, Deep Copy
Use the module “copy” to make a truely independent copy of a list.
import copy list_a = [[3, 4], [5, 6, [7, 8]]] list_b = copy.deepcopy(list_a) list_a[0][1] = 9 print(list_a) # [[3, 9], [5, 6, [7, 8]]] print(list_b) # [[3, 4], [5, 6, [7, 8]]]
What is Shallow Copy?
All the following only does shallow copy:
lst2 = lst.slice(…)
lst2 = lst.extend(…)
lst2 = list(lst)
They only create a copy on the 0th level. That's called shallow copy. The elements of a nested element are copied by reference.
# example of shallow copy. Changing a nested element still effect the original list aa = [[3, 6], [5, [8]]] bb = list(aa) aa[0][1] = 9 print(aa) # [[3, 9], [5, [8]]] print(bb) # [[3, 9], [5, [8]]]
See also: Python: dict={} vs dict.clear() .