Terry J. Reedy <tjre...@udel.edu> added the comment: Searching on 'exec NameError' shows that this issue is a duplicate of (behavior issue) #1167300 which contained an essentially identical example"
>>> exec """\ ... x = 3 ... def f(): ... print x ... f() ... """ in {}, {} #1167300 was closed as a duplicate of (behavior issue) #991196, which in turn was closed as 'won't fix' (ie, works as it must). Doc issue #4831, which resulted in some doc changes, seems related to this but is not the same. I believe this issue is a duplicate of #13557, which has a patch. I will add my proposed change there. Anyway, my comments: In 3.2.2, this runs #prog='''\ x = 1 def weird(): y = x + 1 return y print(weird()) #''' #exec(prog) The same uncommented does also, as does adding ',{}' to the call. Adding ',{},{}' gives the NameError. With one named {} arg passed twice, as follows, it runs. d = {} exec(prog, d, d) The reasons for these results are: 1. assignments are *always* to the local namespace. 2. normally, for module code, the local and global namespaces are the same. 3. in the example, 'x=1' is the same as "values['x']=1", while within the function, 'y=x+1' looks up x in gvalues. This is the same explanation as given in #1167300. ---------- nosy: +terry.reedy resolution: -> duplicate status: open -> closed superseder: -> exec of list comprehension fails on NameError versions: +Python 3.2, Python 3.3 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue14049> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com