On Fri, 30 Aug 2013 23:07:47 -0700, Fabrice Pombet wrote: > well, look at that: > > a=(1,2) > a=2+3 ->a is an object and I have changed its type and value from > outside.
Incorrect. You have not changed the type or value of any object. "a" is not an object, it is a *name*, and while you can change the object bound to the name, the objects remain unchanged. When you do this: x = 23 x = 42 the *object* 23 does not change, only the name binding changes. To do otherwise would cause all sorts of surprises: # THIS DOES NOT HAPPEN IN PYTHON # or any other language, as far as I am aware x = 23 y = x # y now has the value 23 x = 42 # change the value of the object ### NOT SO! ### print y => prints 42 Name binding (assignment) does not change objects. It changes the link between a name and the object, but the object remains untouched (unless it is unbound, and garbage collected). Assignment is not mutation. Assigning to a name does not modify the object that was previously bound. But even if you were right about changing the type and value of objects in place -- Python allows you to mutate lists and dicts in place, and even mutate the type of some objects, although not built-ins -- your understanding is still confused. Re-assignment (re-binding) of local variables is hardly a violation of encapsulation. But if it was, then Java and C++ have no encapsulation either, because you can re-assign to local variables inside a function too. If you want to see a language without encapsulation, you need to look at something like 1970s-style BASIC, a language where all variables are global, where there is no support for grouping related code into separate modules or files, where the closest thing to a function call is GOTO or GOSUB. Of course, languages can have *more* or *less* encapsulation than other languages. C lets you encapsulate related functions into a file, but it has no way of grouping data and functions together except loosely, in a file. C++ adds classes, which has more encapsulation since you can group functions and their data together. > As far as I am concerned this is one hell of an encapsulation > violation... Could you do this -strictly speaking- in Java or C++? Of course you could. All you need is a way to tell the compiler not to type-check the variable "a". Or more practically, some way to declare variable "a" as a reference to an untyped or generic value. C# has the dynamic keyword for this functionality. I don't know about Java or C++, but the JVM is certainly capable of implementing dynamic typing as there are various dynamically-typed languages built on top of the JVM, such as OpenXION and Cobra. -- Steven -- http://mail.python.org/mailman/listinfo/python-list