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.

classification
Title: Nested For Loop in Python not working as Expected after cnt=2136
Type: behavior Stage: resolved
Components: Build Versions: Python 3.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: anthonybaxter, barry, benjamin.peterson, eric.araujo, ezio.melotti, georg.brandl, gvanrossum, lemburg, mdk, ned.deily, pradnyan, tarek, xtreak
Priority: normal Keywords:

Created on 2019-06-29 15:31 by pradnyan, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
Pyton_For_Loop_issue.zip pradnyan, 2019-06-29 15:31 The zip file contains actual python code and its unexpected output.
Messages (2)
msg346884 - (view) Author: Pradnyan (pradnyan) * Date: 2019-06-29 15:31
I have come across very strange Python bug in nested for loops:
See below nested for loop with range function and its not working as expected.

It worked fine until cnt=2136 and start giving unexpected output after that. 

As per logic y value should get incremented for every x value but after cnt=2136 the y value remains 0 and x gets incremented and also
code did not stop for cnt>2137 and it halts only at 5352.

I have attached actual python code and its output. This code is executed on latest python build 3.7.3

Erroneous output 
================================================================
cnt=2134 y=2133 x=0
cnt=2135 y=2134 x=0
cnt=2136 y=2135 x=0
cnt=2137 y=0 x=1
cnt=2138 y=1 x=1
cnt=2139 y=0 x=2
cnt=2140 y=0 x=3
cnt=2141 y=0 x=4

==================================================================
==================================================================
Python code:
==================================================================
 cnt=0
    for x in range(3216):
        for y in range(2136):
            cnt = cnt + 1
            #print("y="+str(y)+" x="+str(x)+" pixel="+str(im_ary[y,x]))
            print("cnt="+str(cnt)+" y=" + str(y) + " x=" + str(x) )
            if cnt>2137 :
                break

=================================================================
msg346886 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python committer) Date: 2019-06-29 15:47
@pradnyan The break statement [0] only exits the for loop where it's present in this the one where y is involved so the outer loop involving x will continue to execute. So after every attempt where y = 0 the cnt value succeeds and breaks out of the loop. I think this is a problem with the logic that you want to refactor and not a problem with CPython.

def test():
    cnt=0
    for x in range(3216):
        for y in range(2136):
            cnt = cnt + 1
            print("cnt="+str(cnt)+" y=" + str(y) + " x=" + str(x) )
            if cnt > 2137 : 
                break # Break only out of "for y in in range(2136)"

In future reports please also don't add many people to the nosy list.

[0] https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops
History
Date User Action Args
2022-04-11 14:59:17adminsetgithub: 81628
2019-06-29 15:47:58xtreaksetstatus: open -> closed

nosy: + xtreak
messages: + msg346886

resolution: not a bug
stage: resolved
2019-06-29 15:31:31pradnyancreate