Shallow Copy & Deep Copy in Python

Buy Me a Coffee☕ *My post explains variable assignment in Python. Normal Copy: *Memos: The reference of a list is stored in a variable. v1 and v2 have the same references of the same shallow list. v1 and v2 have the same references of the same deep list. #### Shallow list #### # ↓↓↓↓↓↓↓↓↓↓↓ ↓ v1 = ['a', 'b', ['c', 'd']] # Equivalent v2 = v1 # ↑↑↑↑↑↑↑↑↑↑ # v1 = v2 = ['a', 'b', ['c', 'd']] # Deep list print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'B', ['C', 'd']] ['a', 'B', ['C', 'd']] Shallow Copy *Memos: copy() can be used for shallow copy. v1 and v2 have the different references of the different shallow lists. v1 and v2 have the same references of the same deep list. v1 = ['a', 'b', ['c', 'd']] v2 = v1.copy() print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']] *The below with copy() is equivalent to the above. from copy import copy v1 = ['a', 'b', ['c', 'd']] v2 = copy(v1) print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']] *The below with list() is equivalent to the above. v1 = ['a', 'b', ['c', 'd']] v2 = list(v1) print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']] Deep Copy *Memos: deepcopy() can be used for deep copy. v1 and v2 have the different references of the different shallow lists. v1 and v2 have the different references of the different deep lists. from copy import deepcopy v1 = ['a', 'b', ['c', 'd']] v2 = deepcopy(v1) print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']] *The below with copy() is equivalent to the above. v1 = ['a', 'b', ['c', 'd']] v2 = v1.copy() v2[2] = v2[2].copy() print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']] *The below with copy() is equivalent to the above. from copy import copy v1 = ['a', 'b', ['c', 'd']] v2 = copy(v1) v2[2] = copy(v2[2]) print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']] *The below with list() is equivalent to the above. v1 = ['a', 'b', ['c', 'd']] v2 = list(v1) v2[2] = list(v2[2]) print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']] v2[1] = 'B' v2[2][0] = 'C' # ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']] *Additionally, the below is a 3D list. from copy import deepcopy v1 = ['a', 'b', ['c', ['d']]] v2 = deepcopy(v1) print(v1, v2) # ['a', 'b', ['c', ['d']]] ['a', 'b', ['c', ['d']]] v2[1] = 'B' v2[2][0] = 'C' v2[2][1][0] = 'D' # ↓↓↓ ↓↓↓ ↓↓↓ print(v1, v2) # ['a', 'b', ['c', ['d']]] ['a', 'B', ['C', ['D']]]

May 6, 2025 - 23:22
 0
Shallow Copy & Deep Copy in Python

Buy Me a Coffee

*My post explains variable assignment in Python.

Normal Copy:

*Memos:

  • The reference of a list is stored in a variable.
  • v1 and v2 have the same references of the same shallow list.
  • v1 and v2 have the same references of the same deep list.
     #### Shallow list ####
#    ↓↓↓↓↓↓↓↓↓↓↓          ↓ 
v1 = ['a', 'b', ['c', 'd']] # Equivalent
v2 = v1       # ↑↑↑↑↑↑↑↑↑↑  # v1 = v2 = ['a', 'b', ['c', 'd']]
              # Deep list

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #       ↓↓↓   ↓↓↓              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'B', ['C', 'd']] ['a', 'B', ['C', 'd']]

Shallow Copy

*Memos:

  • copy() can be used for shallow copy.
  • v1 and v2 have the different references of the different shallow lists.
  • v1 and v2 have the same references of the same deep list.
v1 = ['a', 'b', ['c', 'd']]
v2 = v1.copy()

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #             ↓↓↓              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']]

*The below with copy() is equivalent to the above.

from copy import copy

v1 = ['a', 'b', ['c', 'd']]
v2 = copy(v1)

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #             ↓↓↓              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']]

*The below with list() is equivalent to the above.

v1 = ['a', 'b', ['c', 'd']]
v2 = list(v1)

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #             ↓↓↓              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['C', 'd']] ['a', 'B', ['C', 'd']]

Deep Copy

*Memos:

  • deepcopy() can be used for deep copy.
  • v1 and v2 have the different references of the different shallow lists.
  • v1 and v2 have the different references of the different deep lists.
from copy import deepcopy

v1 = ['a', 'b', ['c', 'd']]
v2 = deepcopy(v1)

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #                              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']]

*The below with copy() is equivalent to the above.

v1 = ['a', 'b', ['c', 'd']]
v2 = v1.copy()
v2[2] = v2[2].copy()

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #                              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']]

*The below with copy() is equivalent to the above.

from copy import copy

v1 = ['a', 'b', ['c', 'd']]
v2 = copy(v1)
v2[2] = copy(v2[2])

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #                              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']]

*The below with list() is equivalent to the above.

v1 = ['a', 'b', ['c', 'd']]
v2 = list(v1)
v2[2] = list(v2[2])

print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'b', ['c', 'd']]

v2[1] = 'B'
v2[2][0] = 'C'
              #                              ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['c', 'd']] ['a', 'B', ['C', 'd']]

*Additionally, the below is a 3D list.

from copy import deepcopy

v1 = ['a', 'b', ['c', ['d']]]
v2 = deepcopy(v1)

print(v1, v2) # ['a', 'b', ['c', ['d']]] ['a', 'b', ['c', ['d']]]

v2[1] = 'B'
v2[2][0] = 'C'
v2[2][1][0] = 'D'
              #                                ↓↓↓   ↓↓↓   ↓↓↓
print(v1, v2) # ['a', 'b', ['c', ['d']]] ['a', 'B', ['C', ['D']]]