This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author steven.daprano
Recipients Jeffrey.Kintscher, eric.smith, rameshsahoo11, steven.daprano
Date 2020-08-11.09:59:52
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <20200811095919.GF23924@ando.pearwood.info>
In-reply-to <1597130180.68.0.308135625521.issue41518@roundup.psfhosted.org>
Content
On Tue, Aug 11, 2020 at 07:16:20AM +0000, Ramesh Sahoo wrote:

> for i in stack:
>         print("inside if Popped =",stack.pop(stack.index(i)))

You are mutating the list while you iterate over it. This is prone to 
cause trouble. Here's is a much smaller and simpler demonstration:

items = [1, 2, 3, 4, 5]
for index, value in enumerate(items):
    print(f"index: {index}, value: {value}, items: {items}")
    if value == 2:
        x = items.pop(index)
        print(f"after popping 2: {items}")

which has output:

index: 0, value: 1, items: [1, 2, 3, 4, 5]
index: 1, value: 2, items: [1, 2, 3, 4, 5]
after popping 2: [1, 3, 4, 5]
index: 2, value: 4, items: [1, 3, 4, 5]
index: 3, value: 5, items: [1, 3, 4, 5]

If you trace the code execution in your head, you will see that this is 
correct behaviour: Python is walking the list from position to position, 
but you removed one of the values so everything shifts and you end up 
skipping a value, because it moves before the loop can reach it.

The lesson here is:

Don't mutate a list that you are iterating over if you can avoid it. It 
you cannot avoid it, you can avoid problems by iterating in reverse, and 
only mutating the part of the list you have already processed.

But better to avoid mutation altogether.

So not a bug. Python is doing exactly what you told it to do.
History
Date User Action Args
2020-08-11 09:59:52steven.dapranosetrecipients: + steven.daprano, eric.smith, Jeffrey.Kintscher, rameshsahoo11
2020-08-11 09:59:52steven.dapranolinkissue41518 messages
2020-08-11 09:59:52steven.dapranocreate