Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Python weird iterator behaviour

I was on another SO question here :
Query on [Python sum of number in array, ignoring sections of specific numbers]

In this question, there was a code similar to this :

it = iter([4, 5, 6, 7, 8, 9])
print([x for x in it if x!=4 not in it]) #Output [5]

To my understanding, an iterator is like a list in which we remove each element after accessing them.
I also get that making an operation like not in will loop over the iterator until it find the value it’s searching for. So in the case where we do 3 not in iter([1, 2]) the iterator will be empty since the not in have looped over all of it to confirm that 3 wasn’t included.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

So in my understanding, the first iteration of the for loop should do the following :

it = iter([4, 5, 6, 7, 8, 9])
for x in it:
    #Here it look like [5, 6, 7, 8, 9] and x is 4
    if x!=4 not in it:
        # So here we've done 
        #x!=4 => False 
        #then False not in it
        #Since False isn't in it the iterator should now be empty and we don't enter this if
        print(x)

#And there is'nt a second iteration since the iterator is empty dues to the if condition so
#the loop should end after the first iteration without anything printed

But this code output is 5 how on earth is this possible ???
So if someone can explain in details what is happening exactly it would be greatly appreciated !

Side notes :
I’ve also tried with

  • (x!=4) not in it ⇾ output is 4
  • x!=(4 not in it) ⇾ output nothing

Which make me wonder how is this condition interpreted by python, since none of the parenthesized versions match the version without parenthesis.

>Solution :

So, the problem here is the expression:

x != 4 not in it

Is implicitly chained, because that is how comparison operators work

So that means it is evaluated as:

(x != 4) and (4 not in it)

Since x != 4 is False on the first iteration, it short circuits and goes on to the next iteration without evaluating 4 in it. In which case, x == 5, and it doesn’t short circuit and it exhausts the iterator checking if 5 not in it, in which case, the whole expression is True and it is the only item in the resulting list.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading