Skip to main content

Python Hunter, Deep copy and Shallow copy by pran sukh

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. 







 Follow Python Hunter on youtube   Follow Python Hunter on twitter Follow on tumbl ( at your own risk ) check profile on linkedIn 

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)
In the above code the list1 created and initialized and list1 is passed to 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))
The output value of memory location for the both list1 and list2 will be same, that's why change in any list will reflect to other list object too.

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.

1
2
print(id(list_[2]))
print(id(list2[2]))


Observe the screen shot.


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

Popular posts from this blog

Understanding the usage of underscore( _ ) of Python for beginner. On Python Hunter

Introduction: Just like you, a newbie in python scripting language, me too was confused about lot of new things in python that are not valid or available in other languages like Java, .Net etc. Just like other things i had seen the use of '_' underscore in python, at beginning level that flabbergasted me for a while.      With some research and practice i have summarised the following usage of '_' underscore in python. Hope you will find it helpful at beginning level. First Usage : Hold the previous output value. When used in interpreter. 1 2 3 4 5 6 7 _ = input () # For example you typed '5' print (_) # This will print '5' print ( int ( _ ) * int ( _ ) ) # This will print '25' print ( int ( _ ) + 10 ) The above will print '15', because last input was "5" and in above   line of code is producing '25' as output but not being handl

Understanding "with" keyword in python, on Python Hunter

J ust like anything in python, keyword "with" is introduced in python to make the things little easy. Imagine a situation where you have to manage the resources e.g opening file and closing them after the code is executed on file. To achieve this sort of task we have to write the code as follow:      Download   But if you do it often you could do this as follow to make the code reusable: Download But why do you need to do this when you know that you have to execute the only for once.  To answer this question  python-dev team finally came up with following approach: Download  Note:- Make sure you have "file.txt" and python code file in same dir. The "with"  keyword replaces the try finally block. "with" keyword executes the openFileClass() context manager and internally calls the __enter__(self) method, and whatever is being returned from __enter__(self) method is being stored in tar

XSLT apply import tag by pran sukh on python hunter blog

Modular Programming is good attitude of best programmer. We often need to keep our code in modular approach so that is would be easy to maintain  and update or remove dead code and also it ease the process of bug tracking. XML and XSL  processors provide freedom to import multiple imports to process the same  XML  document. In the following  XML  data we have data from collage where student's and teacher's data is given. But we want to process the same  XML  data with different XSL files. Here in this example we want to show the teacher data in red background color and student data in green background color. Data.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "RootXSLT.xsl"?> <data> <DataFor name = "Student" id = "001" > <firstname>