Python: Copy Nested List, Shallow/Deep Copy

By Xah Lee. Date: . Last updated: .

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. Example:

# -*- coding: utf-8 -*-
# python

list_a = [3, 4, 5]
list_b = list_a
list_a[0] = 7
print list_b # returns [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.

# -*- coding: utf-8 -*-
# python

aa = [3, 4, 5]
bb = aa

print id(aa)                # 139783211490192
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.

# -*- coding: utf-8 -*-
# python

list_a = [3,4,5]
list_b = list_a[:]

print id(list_a) == id(list_b) # prints “false”. They are different objects
print list_a == list_b # prints “true”.

Copy Flat List Using 「.extend()」

# -*- coding: utf-8 -*-
# python

list_a = [3, 4, 5]
list_b = []
list_b.extend(list_a)

print id(list_a) == id(list_b) # prints “false”

print list_a == list_b # prints “true”.

Copy Flat List Using 「list()」

The best way to copy flat list is using ℓ2 = list().

# -*- coding: utf-8 -*-
# python

list_a = [3, 4, 5]
list_b = list(list_a)

print id(list_a) == id(list_b) # prints “false”

print list_a == list_b # prints “true”.

Copying Nested List, Deep Copy

Use the module “copy” to make a truely independent copy of a list.

# -*- coding: utf-8 -*-
# python

import copy

list_a = [[3, 4], [5, 6, [7, 8]]]
list_b = copy.deepcopy(list_a)

list_a[0][1] = 9

print list_a # prints [[3, 9], [5, 6, [7, 8]]]
print list_b # prints [[3, 4], [5, 6, [7, 8]]]

What's Shallow Copy?

All the following only does shallow copy:

They only create a copy on the 0th level. That's called shallow copy. The elements of a nested element are copied by reference.

# -*- coding: utf-8 -*-
# python

# 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: What's the Difference Between 「dict={}」 vs 「dict.clear()」?.

Ask me question on patreon