Python Forum

Full Version: Problems with For Loops and Lists
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello all,
I am beginner and I can't find the mistake in my code.

Starting with a list list_item = [0, 0, 0] I want modify every single element sequentially.
I want also that each modified element will become an element of the list called list_with_list_items.

I wrote this code:

list_item = [0, 0, 0] 
list_with_list_items=[] 
for n0 in range(0, 5): 
    list_item [0] = n0+1 
    for n1 in range(n0+1, 6): 
        list_item [1] = n1+1 
        for n2 in range(n1+1, 7): 
            list_item [2] = n2+1 
            print(str(list_item)) 
            list_with_list_items.append(list_item) 
print(str(list_with_list_items)) 
but the output is:
[[5, 6, 7], [5, 6, 7], [5, 6, 7], …., [5, 6, 7], [5, 6, 7], [5, 6, 7]]

what I want is:
[[1, 2, 3], [1, 2, 4], [1, 2, 5], …., [4, 5, 7], [4, 6, 7], [5, 6, 7]]

but I can't find the mistake.

Thank you in advance for your help.
This is because of reference-counting model of object management in Python. list_item points to "container" that initially
stores [0,0,0]. You are changing list_item in a loop, but since lists are mutable in Python, Python doesn't create new object each time you change list_item elements. list_item points to the same container. So, list_with_list_items accumulates references to the same container, which final state is [5, 6, 7]. You need to force Python to create a new list object when appending data to list_with_list_items. This could be easily done by replacing list_item with list_item[:] in line #10 of your code.
Amazing, thank you!!!
I would never have thought of it.
Best regards
MB