*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 variable assignment.
Normal Copy:
*Memos:
-
v1
andv2
refer to the same shallow and deep dictionary. -
is
keyword can check ifv1
andv2
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
Shallow Copy:
copy() can do shallow copy as shown below:
*Memos:
-
v1
andv2
refer to the different shallow dictionaries. -
v1
andv2
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
Deep Copy:
deepcopy() can do deep copy as shown below:
*Memos:
-
v1
andv2
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}
# ↑↑↑↑↑ ↑↑↑↑↑
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'}}}
# ↑↑↑↑↑ ↑↑↑↑↑ ↑↑↑↑↑
Top comments (0)