On 8/31/13 7:46 AM, Steven D'Aprano wrote:
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.


I wrote a piece about names and values that might help clarify these points: Facts and Myths about Names and Values in Python: http://nedbatchelder.com/text/names.html

--Ned.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to