DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

Shallow Copy & Deep Copy in Python (5)

Buy Me a Coffee

*Memos:

  • My post explains a dictionary, the dictionary with keying and copy.
  • 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 variable assignment.

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

copy() can do 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() # Here  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() which can do shallow copy is equivalent to the above:

from copy import copy v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = copy(v1) # Here  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 can do shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = dict(v1) # Here  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>:

deepcopy() can do deep copy as shown below:

*Memos:

  • v1 and v2 refer to the different shallow and deep dictionaries.
  • deepcopy() should be used because it's safe, doing copy deeply.
from copy import deepcopy v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = deepcopy(v1) # Here  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() which can do shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = v1.copy() # Here v2['d'] = v1['d'].copy() # Here  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() which can do shallow copy is equivalent to the above:

from copy import copy v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = copy(v1) # Here v2['d'] = copy(v1['d']) # Here  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 can do shallow copy is equivalent to the above:

v1 = {'k':'v_a', 'd':{'k':'v_b'}} v2 = dict(v1) # Here v2['d'] = dict(v1['d']) # Here  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:

from copy import deepcopy v1 = {'k':'v_a', 'd':{'k':'v_b', 'd':{'k':'v_c'}}} v2 = deepcopy(v1) # Here  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

Top comments (0)