Python 3 removes name binding from outer scope
Chris Angelico
rosuav at gmail.com
Tue Jul 25 16:06:02 EDT 2017
On Wed, Jul 26, 2017 at 4:36 AM, eryk sun <eryksun at gmail.com> wrote:
> On Tue, Jul 25, 2017 at 8:43 AM, Chris Angelico <rosuav at gmail.com> wrote:
>>
>> I'm not actually sure what happens if you use a global declaration at
>> top level. Is it ignored? Is it an error?
>
> It isn't ignored, but it shouldn't make a difference since normally at
> module level locals and globals are the same. It makes a difference in
> an exec() that uses separate locals and globals dicts. For example:
>
> >>> exec('print(x)', {'x':'G'}, {'x':'L'})
> L
> >>> exec('global x; print(x)', {'x':'G'}, {'x':'L'})
> G
Thanks. Of course, that doesn't change the fact that it'll look very
odd - but at least it won't cause a problem. Now, if you wanted to
write Py2/Py3 compatibility code inside a function, you'd have issues,
because you can't use nonlocal in Py2... but that's a separate issue.
Hmm. Aside from messing around with exec, is there any way to have a
local and a global with the same name, and use the global? You could
do it with a nonlocal:
x = "G"
def f():
x = "L"
def g():
global x
print(x)
g()
but is there any way to engineer this actual situation without exec?
ChrisA
More information about the Python-list
mailing list