exec behaviour

Fredrik Lundh fredrik at pythonware.com
Fri Nov 4 22:07:32 CET 2005


N. Pourcelot wrote:

> I can't understand some specific behaviour of the exec statment.
>
> For example, say that I create such a class A :
>
> class A:
>     def __init__(self):
>         self.n = 3
>         self.m = None
>     def h(self, ini):
>         n = self.n
>         m = self.m
>         if ini: exec("def m(x): return n+x"); self.m=m
>         else: m(7)
>
> Now :
> obj = A()
> obj.h(1)
> obj.h(0)
>
> I get :
>
> Traceback (most recent call last):
>   File "<input>", line 1, in ?
>   File "<input>", line 9, in h
>   File "<string>", line 1, in m
> NameError: global name 'n' is not defined

exec only supports local and global scopes; the "n" inside the exec statement
is a not a local, so it's assumed to be a global variable.

(Python's lexical scoping requires the compiler to look for free variables in inner
scopes before generating code for the outer scope; it cannot do that for exec, for
obvious reasons).

</F> 






More information about the Python-list mailing list