Python becoming less Lisp-like
Jeff Shannon
jeffshannon at gmail.com
Fri Mar 18 12:16:42 EST 2005
Antoon Pardon wrote:
> Op 2005-03-16, Jeff Shannon schreef <jeffshannon at gmail.com>:
>
>>Bruno Desthuilliers wrote:
>>
>>>- if x is a class attribute of class A and a is an instance of A,
>>>a.x=anyvalue create a new instance attribute x instead of modifying A.x
>>
>>This is very consistent with the way that binding a name in any scope
>>will shadow any bindings of that name in "higher" scopes. It is the
>>same principle by which one is able to use the same name for a
>>function-local variable that is used for a global variable, without
>>destroying that global variable. [...]
>
> Not entirely. The equivallent is imposible in function scope.
> If function scope would work exactly equivallent as the
> above the following should work
>
> a = 42
> def f():
> a = a + 1
> print a
> print a
>
> And the result should be:
>
> 43
> 42
>
I'd still say that the name binding rules are very consistent. The
name lookup rules are a little different (as they *should* be for
class/instance attributes), and that's why there's a different net
effect (UnboundLocalError) as shown in your example. I'd say,
however, that if there's a special case here it's with the
function-local variables, not the class/instance attributes. It's the
optimizations to the function-local namespace which prevent
transparent re-binding of global names. And given that the
function-local namespace is by far the most heavily used, and the
relative utility (and wisdom) of using globals in this way, this is a
case where the benefit of the special case is well worth the cost of
its slight inconsistency.
Jeff Shannon
More information about the Python-list
mailing list