Why is an element not printing?

Question:

I am learning the list and list assignments and using while and for loops with lists. I wrote the following code just to test my understanding.

I=[1,4, 7, 6, 7,8,9]
IU=I

while IU !=[]:
    print ('I: ',I)
    print('IU :' ,IU)
    for i in I:
        print(i)
        if i*i<=36:
            IU.remove(i)
            print(IU)
    if i>=9:
        break 

This gives the following output:

I:  [1, 4, 7, 6, 7, 8, 9]
IU : [1, 4, 7, 6, 7, 8, 9]
1
[4, 7, 6, 7, 8, 9]
7
6
[4, 7, 7, 8, 9]
8
9

My understanding is that it would print 4 after it removed 1 from IU. However it is not printing 4. Any hints on why this is happening?

Asked By: mars

||

Answers:

Issue

The issued line is IU=I

This line does not create a new list IU. Python creates a reference ‘IU’ to the original list I, which means IU and I point to the same list. Thus, when you remove 4 from your I, IU get affected too.

Solution

There are different ways of copying of I. For example, you can

IU = [_ for _ in I]

Or

IU = I.copy()

Or

IU = I[:]

demo

Here is a demo show the difference

L = [1,2]
Ref = L
Cpy = L.copy()

L.append(3)
print(Ref)
print(Cpy)
  • Output

    [1, 2, 3]
    [1, 2] 
    
Answered By: Xin Cheng

You don’t see 4 printed because when the program removed 1 initially, the loop pointer i was pointing to 1, and so, once 1 got removed, the i pointer moved to the next element, 4. And at the end of the loop, since the for loop goes over to the next element (i++ that we do in c++), it points at 7 at the starting of next iteration.
Hope I could solve your doubt.

Answered By: Saptarshi Das

List in python is implemented using Dynamic Array

Here, after the removal of 1 from the list, the list on the left moves backward(not exactly but somewhat similar), so i now points to 4.

Now i gets incremented, thus now i points to the next memory location.

Please check the link to see how the list gets implemented inside python.

Answered By: Shankar Challa
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.