[Python] Shallow copy/Deep copy

Rex Chiang
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.

--

--

No responses yet