Monday, 27 June 2016

List of List-Python

Today I am sharing a real time issue.
Currently i am working on reporting module. where to print a report of selled product i need to send product list in report file.
so, I am passing that product list like following.

product_list = [['product_1']*4]*4

Here, total sell of product_1 is 16, and in a one row of A4 size paper i want 4 product label.
so, this will give me like following result:
product_list = [['product_1', 'product_1', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1']]

In product_list[0][1] index i need to change 'product_1' to 'product_2'.
so, I wrote following code.

product_list[0][1] = 'product_2'

Here, i expected output is like following:

product_list = [['product_1', 'product_2', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1'],
        ['product_1', 'product_1', 'product_1', 'product_1']]

But i got following result.

product_list = [['product_1', 'product_2', 'product_1', 'product_1'],
        ['product_1', 'product_2', 'product_1', 'product_1'],
        ['product_1', 'product_2', 'product_1', 'product_1'],
        ['product_1', 'product_2', 'product_1', 'product_1']]

Do you see the problem, second element of all the list changed to 'product_2'.
So it means [['product_1']*4]*4 creates a list that contains reference to the same list ['product_1', 'product_2', 'product_1', 'product_1']

To avoid this we can write following code:

n,m = 4,4
product_list = []
for x in xrange(n):
product_list.append(['product_1'] * m)
print product_list
o/p : [['product_1', 'product_1', 'product_1', 'product_1'],
       ['product_1', 'product_1', 'product_1', 'product_1'],
       ['product_1', 'product_1', 'product_1', 'product_1'],
       ['product_1', 'product_1', 'product_1', 'product_1']]

product_list[0][1] = 'product_2'
print "After Update : ",product_list
After Update : [['product_1', 'product_2', 'product_1', 'product_1'],
               ['product_1', 'product_1', 'product_1', 'product_1'],
               ['product_1', 'product_1', 'product_1', 'product_1'],
               ['product_1', 'product_1', 'product_1', 'product_1']]

No comments:

Post a Comment