Issue 28241: Nested fuctions Unexpected behaviour when stored in a list and called after. (original) (raw)

Issue28241

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:37 admin set github: 72428
2016-09-21 16:45:19 artxyz set messages: +
2016-09-21 16:21:52 r.david.murray set nosy: + r.david.murraymessages: +
2016-09-21 15:27:05 zach.ware set status: open -> closednosy: + zach.waremessages: + resolution: not a bugstage: resolved
2016-09-21 15:12:53 artxyz create