In Python, Assignment statements do not copy objects, they create bindings between a target and an object. When we use the = operator, It only creates a new variable that shares the reference of the original object. In order to create “real copies” or “clones” of these objects, we can use the copy module in Python.
Syntax of Deep copy
Syntax: copy.deepcopy(x)
Syntax of Shallow copy
Syntax: copy.copy(x)
Example:
In order to make these copies, we use the copy module. The copy() returns a shallow copy of the list, and deepcopy() returns a deep copy of the list. As you can see that both have the same value but have different IDs.
Python3
# importing copy module import copy # initializing list 1 li1 = [ 1 , 2 , [ 3 , 5 ], 4 ] # using copy for shallow copy li2 = copy.copy(li1) print ( "li2 ID: " , id (li2), "Value: " , li2) # using deepcopy for deepcopy li3 = copy.deepcopy(li1) print ( "li3 ID: " , id (li3), "Value: " , li3) |
Output:
li2 ID: 2521878674624 Value: [1, 2, [3, 5], 4] li3 ID: 2521878676160 Value: [1, 2, [3, 5], 4]
What is Deep copy in Python?
A deep copy creates a new compound object before inserting copies of the items found in the original into it in a recursive manner. It means first constructing a new collection object and then recursively populating it with copies of the child objects found in the original. In the case of deep copy, a copy of the object is copied into another object. It means that any changes made to a copy of the object do not reflect in the original object.
Example:
In the above example, the change made in the list did not affect other lists, indicating the list is deeply copied.
Python
# importing "copy" for copy operations import copy # initializing list 1 li1 = [ 1 , 2 , [ 3 , 5 ], 4 ] # using deepcopy to deep copy li2 = copy.deepcopy(li1) # original elements of list print ( "The original elements before deep copying" ) for i in range ( 0 , len (li1)): print (li1[i],end = " " ) print ( "\r" ) # adding and element to new list li2[ 2 ][ 0 ] = 7 # Change is reflected in l2 print ( "The new list of elements after deep copying " ) for i in range ( 0 , len ( li1)): print (li2[i],end = " " ) print ( "\r" ) # Change is NOT reflected in original list # as it is a deep copy print ( "The original elements after deep copying" ) for i in range ( 0 , len ( li1)): print (li1[i],end = " " ) |
Output:
The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4
What is Shallow copy in Python?
A shallow copy creates a new compound object and then references the objects contained in the original within it, which means it constructs a new collection object and then populates it with references to the child objects found in the original. The copying process does not recurse and therefore won’t create copies of the child objects themselves. In the case of shallow copy, a reference of an object is copied into another object. It means that any changes made to a copy of an object do reflect in the original object. In python, this is implemented using the “copy()” function.
Example:
In this example, the change made in the list did affect another list, indicating the list is shallowly copied. Important Points: The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):
- A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
- A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
Python3
# importing "copy" for copy operations import copy # initializing list 1 li1 = [ 1 , 2 , [ 3 , 5 ], 4 ] # using copy to shallow copy li2 = copy.copy(li1) # original elements of list print ( "The original elements before shallow copying" ) for i in range ( 0 , len (li1)): print (li1[i],end = " " ) print ( "\r" ) # adding and element to new list li2[ 2 ][ 0 ] = 7 # checking if change is reflected print ( "The original elements after shallow copying" ) for i in range ( 0 , len ( li1)): print (li1[i],end = " " ) |
Output:
The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4
RECOMMENDED ARTICLES – Difference between Shallow and Deep copy of a class