[Python] Shallow copy/Deep copy
2 min readFeb 22, 2022
Assignment
l1 = [[0], 1, 2, 3]
l2 = l1
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3]
print(id(l2), id(l2[0]), l2) # 111, 000, [[0], 1, 2, 3]
l1.append(4)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 111, 000, [[0], 1, 2, 3, 4]
l1[0].append(1)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0, 1], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 111, 000, [[0, 1], 1, 2, 3, 4]
- Used to do an assignment, and just copy the reference.
- Refer to the same memory address of original object.
- The mutable objects in original object refer to the same memory address.
- When the original object modified, it modified too.
- When the mutable objects in original object modified, it modified too.
Shallow copy
import copy
l1 = [[0], 1, 2, 3]
l2 = l1[:]
l3 = list(l1)
l4 = l1.copy()
l5 = copy.copy(l1)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3]
print(id(l2), id(l2[0]), l2) # 222, 000, [[0], 1, 2, 3]
print(id(l3), id(l3[0]), l3) # 333, 000, [[0], 1, 2, 3]
print(id(l4), id(l4[0]), l4) # 444, 000, [[0], 1, 2, 3]
print(id(l5), id(l5[0]), l5) # 555, 000, [[0], 1, 2, 3]
l1.append(4)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 222, 000, [[0], 1, 2, 3]
print(id(l3), id(l3[0]), l3) # 333, 000, [[0], 1, 2, 3]
print(id(l4), id(l4[0]), l4) # 444, 000, [[0], 1, 2, 3]
print(id(l5), id(l5[0]), l5) # 555, 000, [[0], 1, 2, 3]
l1[0].append(1)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0, 1], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 222, 000, [[0, 1], 1, 2, 3]
print(id(l3), id(l3[0]), l3) # 333, 000, [[0, 1], 1, 2, 3]
print(id(l4), id(l4[0]), l4) # 444, 000, [[0, 1], 1, 2, 3]
print(id(l5), id(l5[0]), l5) # 555, 000, [[0, 1], 1, 2, 3]
- Copy the original object, excluding the mutable objects in it.
- The mutable objects in original object still refer to the same memory address.
- When the original object modified, it wouldn’t be modified.
- When the mutable objects in original object modified, it modified too.
Deep copy
import copy
l1 = [[0], 1, 2, 3]
l2 = copy.deepcopy(l1)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3]
print(id(l2), id(l2[0]), l2) # 222, 001, [[0], 1, 2, 3]
l1.append(4)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 222, 001, [[0], 1, 2, 3]
l1[0].append(1)
print(id(l1), id(l1[0]), l1) # 111, 000, [[0, 1], 1, 2, 3, 4]
print(id(l2), id(l2[0]), l2) # 222, 001, [[0], 1, 2, 3]
- Copy the original object, including the mutable objects in it.
- When the original object modified, it wouldn’t be modified.
- When the mutable objects in original object modified, it wouldn’t be modified.