Shallow Copy & Deep Copy in Python (5)
Super Kai (Kazuya Ito)

Super Kai (Kazuya Ito) @hyperkai

About: I'm a web developer. Buy Me a Coffee: ko-fi.com/superkai SO: stackoverflow.com/users/3247006/super-kai-kazuya-ito X(Twitter): twitter.com/superkai_kazuya FB: facebook.com/superkai.kazuya

Joined:
Oct 21, 2021

Shallow Copy & Deep Copy in Python (5)

Publish Date: May 26
1 0

Buy Me a Coffee

*Memos:

  • My post explains the shallow and deep copy of a list.
  • My post explains the shallow and deep copy of a tuple.
  • My post explains the shallow copy of the set with a tuple.
  • My post explains the shallow and deep copy of the set with an iterator.
  • My post explains the shallow and deep copy of an iterator.
  • My post explains a dictionary(1).

<Normal Copy>:

*Memos:

  • v1 and v2 refer to the same shallow and deep dictionary.
  • is keyword can check if v1 and v2 refer to the same dictionary.
     #### Shallow dictionary ####
#    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓           ↓
v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = v1          #   ↑↑↑↑↑↑↑↑↑↑↑
                 # Deep dictionary

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v1 is v2, v1['d'] is v2['d']) # True True

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'V_A', 'd': {'k': 'V_B'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

<Shallow Copy>:

dict.copy() does shallow copy as shown below:

*Memos:

  • v1 and v2 refer to the different shallow dictionaries.
  • v1 and v2 refer to the same deep dictionary.
v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = v1.copy()

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False True

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'V_B'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

The below with copy.copy() which does shallow copy is equivalent to the above:

import copy

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = copy.copy(v1)

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False True

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'V_B'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

The below with dict() which does shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = dict(v1)

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False True

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'V_B'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

<Deep Copy>:

copy.deepcopy() does deep copy as shown below:

*Memos:

  • v1 and v2 refer to the different shallow and deep dictionaries.
  • copy.deepcopy() should be used because it's safe, doing copy deeply while dict.copy(), copy.copy() and dict() aren't safe, doing copy shallowly.
import copy

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = copy.deepcopy(v1)

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False False

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

The below with dict.copy() which does shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = v1.copy()
v2['d'] = v1['d'].copy()

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False False

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

The below with copy.copy() which does shallow copy is equivalent to the above:

import copy

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = copy(v1)
v2['d'] = copy(v1['d'])

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False False

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

The below with dict() which does shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}}
v2 = dict(v1)
v2['d'] = dict(v1['d'])

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b'}}

print(v1 is v2, v1['d'] is v2['d'])
# False False

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
          #       ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'v_b'}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B'}}
          #       ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

Additionally, the below is a 3D dictionary:

import copy

v1 = {'k':'v_a', 'd':{'k':'v_b', 'd':{'k':'v_c'}}}
v2 = deepcopy(v1)

print(v1) # {'k': 'v_a', 'd': {'k': 'v_b', 'd': {'k': 'v_c'}}}
print(v2) # {'k': 'v_a', 'd': {'k': 'v_b', 'd': {'k': 'v_c'}}}

print(v1 is v2, v1['d'] is v2['d'], v1['d']['d'] is v2['d']['d'])
# False False False

v2['k'] = 'V_A'
v2['d']['k'] = 'V_B'
v2['d']['d']['k'] = 'V_C'
          #       ↓↓↓↓↓             ↓↓↓↓↓             ↓↓↓↓↓
print(v1) # {'k': 'v_a', 'd': {'k': 'v_b', 'd': {'k': 'v_c'}}}
print(v2) # {'k': 'V_A', 'd': {'k': 'V_B', 'd': {'k': 'V_C'}}}
          #       ↑↑↑↑↑             ↑↑↑↑↑             ↑↑↑↑↑
Enter fullscreen mode Exit fullscreen mode

Comments 0 total

    Add comment