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?
CodePudding user response:
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]
CodePudding user response:
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.
CodePudding user response:
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.
