[Python-ideas] binding vs rebinding

Steven D'Aprano steve at pearwood.info
Fri Feb 6 14:39:18 CET 2009

spir wrote:
> Le Fri, 06 Feb 2009 08:31:58 +1100,
> Ben Finney <ben+python at benfinney.id.au> a écrit :
>>> I wonder why there is no difference in syntax between binding and
>>> rebinding. Obviously, the semantics is not at all the same, for
>>> humans as well as for the interpreter:  
>>> * Binding: create a name, bind a value to it.
>>> * Rebinding: change the value bound to the name.  
>> That's not obvious. The semantics could just as well be described as:
>>   * Binding: bind this name to that value.
>>   * Rebinding: bind this name to that value.
> You are right do describe it like that. I agree that the point of view is not wrong. However,
> * At the interpreter level, as far as I know, rebinding does not create the name like if it was unknown. (Note that a similar issue happens with dicts.)

Both binding and rebinding actions are identical.

 >>> x = 5
 >>> import dis
 >>> dis.dis( compile("x=3  # rebinding", '', 'single') )
   1           0 LOAD_CONST               0 (3)
               3 STORE_NAME               0 (x)
               6 LOAD_CONST               1 (None)
               9 RETURN_VALUE
 >>> del x
 >>> dis.dis( compile("x=3  # new binding", '', 'single') )
   1           0 LOAD_CONST               0 (3)
               3 STORE_NAME               0 (x)
               6 LOAD_CONST               1 (None)
               9 RETURN_VALUE

Whatever implementation difference there may be is transparent at the 
interpreter level.

> * At the programmer level, changing the value associated to a name is really a different action than introducing and giving an initial value to a new symbol. For me, *this* is the relevant point: even if the language would behave "behind the scene" the same way in both cases. This is implantation concern.

I disagree. At the programmer level, x=5 is the same thing whether x 
already exists or not.

> A pertinent objection has been raised already in the case of loops:
> for item in container:
> 	# temp symbol
> 	foo = func(item)
> 	# process
> 	do_stuff
> Conceptually, there is a foo for each item. Obviously, we cannot express that properly, because the loop's body is the same for each iteration. The issue here lies in the fact that a loop does not introduce a local namespace, while this is precisely what we *mean* when defining such as utility variable as foo.

Speak for yourself. When I use a for loop, I do not expect or want it to 
create a new namespace.

> In other words: there is a distortion between language semantics and modelizing semantics.

I disagree. I think the language semantics match precisely the semantics 
of name binding as I expect it.


More information about the Python-ideas mailing list