On Fri, Sep 10, 2010 at 2:43 AM, Eli Bendersky <eli...@gmail.com> wrote: > def some_func(myparam): > def internalfunc(): > return cc * myparam > > CPython infers that in 'internalfunc', while 'myparam' is free, 'cc' is > 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?
There's a slight inconsistency. The names a code object explicitly calls out as free variables (i.e. references to cells in outer scopes) are only a subset of the full set of free variables (every referenced name that isn't a local variable or an attribute). >>> from dis import show_code >>> def outer(): ... x, y = 1, 2 ... def inner(): ... print (x, y, a, b, c.e) ... return inner ... >>> f = outer() >>> show_code(f) Name: inner Filename: <stdin> Argument count: 0 Kw-only arguments: 0 Number of locals: 0 Stack size: 6 Flags: OPTIMIZED, NEWLOCALS, NESTED Constants: 0: None Names: 0: print 1: a 2: b 3: c 4: e Free variables: 0: y 1: x a, b, and c are also free variables in the more general sense, but the code object doesn't explicitly flag them as such since it doesn't need to do anything special with them. Cheers, Nick. -- Nick Coghlan | ncogh...@gmail.com | Brisbane, Australia _______________________________________________ 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