having both dynamic and static variables

Paul Rubin no.email at nospam.invalid
Mon Mar 7 21:22:58 EST 2011


Steven D'Aprano <steve+comp.lang.python at pearwood.info> writes:
>>     L[0].append(5)     # mutate L, in some reasonable sense of "mutate"
>
> You haven't mutated the tuple called "L". You've mutated its internal 
> components, which are lists. If you wanted them to also be immutable, you 
> should have used tuples :)

Obviously you are correct in one reasonable sense of "mutate".  In
another sense, if L is immutable and you evaluate a purely computational
function on it two different times, you should get the same result both
times; for example, if you pickle L twice you should get two identical
pickles.  That's what I think of "immutable" as meaning, and obviously
isn't the case with this L.

> The real point I was trying to make is that there are two definitions of 
> "constant" that we care about: immutability and resistance to name re-
> binding. (Unbindability?) Python already gives us all the tools we need 
> for immutability (modulo the usual disclaimers about "we're all adult 
> here", "private attributes are private by convention", etc.). What Python 
> doesn't have is any way of prohibiting name rebinding short of creating a 
> new reserved word like None.

I think I'd also want to be able to make instance attributes
un-rebindable.  E.g.

   class Foo(object):
      @const
      def wibble(self, a): ...

it shouldn't be possible to redefine x.wibble if x is a Foo.  That
should allow for compile-time binding in a lot of practical code.



More information about the Python-list mailing list