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

XML, XSLT info by pran sukh on Python Hunter blog.

What is XML? Many computer systems contain data in incompatible formats. Exchanging data between incompatible systems (or upgraded systems) is a time-consuming task for web developers. Large amounts of data must be converted, and incompatible data is often lost. XML stores data in plain text format. This provides a software- and hardware-independent way of storing, transporting, and sharing data. XML also makes it easier to expand or upgrade to new operating systems, new applications, or new browsers, without losing data. With XML, data can be available to all kinds of "reading machines" like people, computers, voice machines, news feeds, etc. 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 37 38 39 40 41 42 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category= "cooking" > <title lang= "en" > Every

XSLT applyTemeplate tag by pran sukh on Python Hunter.

XSLT is used for presenting XML data in well structured way and in eye appealing sense. In XSLT we can define different templates and maintain criteria for XSLT processor to parse the XML data in and apply different template for different XML tags. Lets examine following example XML DATA. 1 2 3 4 5 6 7 8 9 10 <student id= "1" eCode= "e1" > <firstName> Python 1 </firstName> <lastName> Hunert 1 </lastName> <dob> <day> 01 </day> <month> Jan </month> <year> 1991 </year> </dob> <course> Programmer </course> </student> In above XML data we want to present student id with dark background and eCode with red background colors, First Name in blue color, last name in green color and date of birth in different modes, so it will look like this. Source File:- XML_DATA.xml 1 2 3 4 5 6 7 8 9 10