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 fuctions Unexpected behaviour when stored in a list and called after.
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: artxyz, r.david.murray, zach.ware
Priority: normal Keywords:

Created on 2016-09-21 15:12 by artxyz, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
nested_fun_bug.py artxyz, 2016-09-21 15:12 function that reproduces the bug
Messages (4)
msg277155 - (view) Author: artxyz (artxyz) Date: 2016-09-21 15:12
Python 2.7.11
GCC 4.8.4

Getting weird results when define a nested function in a loop and store them in a list

    x = list()
    for i in xrange(5):
        def FUN():
            print i
        x.append(FUN)

Calling functions from list using index works fine:

    for i in xrange(5):
        print x[i]
        x[i]()
    # prints 0 1 2 3 4

Calling function using iteration through the sequence yields  wrong results, despite current function (f) changes:

    for f in x:
        print f
        f()
    # prints 4 4 4 4 4
msg277160 - (view) Author: Zachary Ware (zach.ware) * (Python committer) Date: 2016-09-21 15:27
See https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result

Note that `lambda: x**2` is equivalent to `def FUN(): return x**2`.
msg277167 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2016-09-21 16:21
Note also that your first example worked only because your loop variable was named i.  If you used, say, 'j', you'd get the same result as in your second example.  This is because the closure is over the named variable, and both in your definition loop and your print loop, that variable is the 'i' in the global namespace.
msg277172 - (view) Author: artxyz (artxyz) Date: 2016-09-21 16:45
I got it now. Thanks!
History
Date User Action Args
2022-04-11 14:58:37adminsetgithub: 72428
2016-09-21 16:45:19artxyzsetmessages: + msg277172
2016-09-21 16:21:52r.david.murraysetnosy: + r.david.murray
messages: + msg277167
2016-09-21 15:27:05zach.waresetstatus: open -> closed

nosy: + zach.ware
messages: + msg277160

resolution: not a bug
stage: resolved
2016-09-21 15:12:53artxyzcreate