On Thu, Sep 9, 2010 at 9:43 AM, Eli Bendersky <eli...@gmail.com> wrote: > The execution model section of the Python reference manual defines free > variables as follows: > > "If a variable is used in a code block but not defined there, it is > a free variable" > > This makes sense and fits the academic definition. The documentation of the > symtable module supports this definition - it says about is_free(): "return > True if the symbol is referenced in its block but not assigned to". > > However, it appears that in the CPython front-end source code (in particular > the parts dealing with the symbol table), a free variables has a somewhat > stricter meaning. For example, in this chunk of code: > > def some_func(myparam): > def internalfunc(): > return cc * myparam > > CPython infers that in 'internalfunc', while 'myparam' is free, 'cc' is
What exactly do you mean by "infers" ? How do you know that it infers that? How does it matter for your understanding of the code? > global because 'cc' isn't bound in the enclosing scope, although according > to the definitions stated above, both should be considered free. The > bytecode generated for loading cc and myparam is different, of course. > > Is there a (however slight) inconsistency of terms here, or is it my > misunderstanding? That remains to be seen (please answer the questions above for a better understanding of your question). Maybe this helps though: global variables are a subset of free variables, and they are treated different for various reasons (some historic, some having to do with optimizations in the code -- I think you saw the latter in the bytecode). -- --Guido van Rossum (python.org/~guido) _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com