In any programming language the copy concept is assigning the value of variable to other variable. But python shows strange behavior when this concept is implemented, follow the examples below.
1 2 3 4 5 6 7 8 9 | list1 = list() list1 = ["Python","Hunter"] list2 = list1 print(list1) print(list2) list2 [1] = "Lover" print(list1) print(list2) |
but when when we change any element in list2 it will will affect the list1 too. execute the script and observe the output.
Explanation:-
Because there was no new assignment to list2, list2 was pointing to the
list1. let's see with id()
1 2 | print(id(list1)) print(id(list2)) |
But we can rectify this problem with copying list data to other list object with slicing operator.
1 2 3 4 5 6 7 | list1 = list() list1 = ["Python","Hunter","is","great"] list2 = list1[:] list2 [3] = "best" print("list2 is updated:- ",list2) print("list1 is not affected:- ",list1) |
As you will see in the output the only list2 is altered but there is no effect on list1. Now just to be sure you can print the memory locations with id(list1) and id(list2) methods and you will see that memory locations are different.
Hurry!! it's fine till here, but the problem emerges again as soon as we have sub list. Even the copying data with slicing operator will not be effective enough.
1 2 3 4 5 6 7 | list_ = ["Python","Hunter",["sub","list"]] list2 = list_[:] print(id(list_)) print(id(list2)) |
When you will execute the above script it will give you different memory location for list_ and list2.
But when you print the memory location for inner list in both list_ and list2 it will give you same output as the inner sub list is residing at same location.
If we change any element value of any list, then it will not make any impact on other list. But as soon as we change the element of sub list (in any list, either list_ or list2) this action will make impact on other list. Let's see an example.
1 2 3 | list_ [1] = "changed" print("list_ :- ",list_) print("list2 (no impact) :- ",list2) # no impact |
When we try to change the sub list's element on one list, it will effect the other list as the sub list is pointing to same memory location.
1 2 3 4 5 | list_ [2][1] = "changed" print("list_ :- ",list_) print("list2 (see the sublist) :- ",list2) # sub list in list2 also changed. |
This problem can be solved by importing deepcopy method from copy module.
1 2 3 4 5 6 7 8 9 10 11 12 13 | from copy import deepcopy lst1 = ["Python","Hunter",["sub","list"]] lst2 = deepcopy(lst1) lst1[0] = "changed"; lst1[2][1] = "changed" print ("list1 is changed and it's sublist also changed.",lst1) print ("list2 is not effected even it's sublist not effected.",lst2) |
Note:- create a file with .py extension and execute it.
Comments
Post a Comment
Thanks in anticipation.