That might be the case for more complex objects...

DillonCo dillonco at comcast.net
Sat Apr 14 17:27:59 EDT 2007


On Saturday 14 April 2007, James Stroud wrote:
> I think that after a += 1, a memory location with a 6 is created and now
>   a points to that because += has assignment buried in it.

Bingo. 

a+=1 will (basically) translate to either "a=a.__iadd__(1)" 
or "a=a.__add__(1)" depending on whether __iadd__ is defined of not.

>>> '__iadd__' in dir(5)
False
>>> '__add__' in dir(5)
True

So therefore "a+=1" becomes "a=a.__add__(a, 1)"
That make is relatively obvious that a '6' would be created and assigned back 
to a.


You can have some fun with this using the 'is' operator.  Remember that 'is' 
compares objects and not values.  So different objects can be equal, but 
aren't the same.  Thus:
>>> a=[1,2,3]
>>> b=[1,2,3]
>>> a == b
True
>>> a is b
False

To demonstrate the idea of name binding:
>>> a=500
>>> b=500
>>> a == b
True
>>> a is b
False
>>> b=a
>>> a is b
True

So typing the literal '500' creates an integer object with the value 500.  By 
typing it twice, two different objects of identical value are created 
and "put in" two variables.  However, by assigning one from the other, the 
same object (created by the literal '500') is assigned to both variables.  
This is why Python calls assignments "bindings"; you're realling just binding 
the object from the right side to the name on the left.


For confusion's sake, here's what happens if you use smaller numbers:
>>> a=1
>>> b=1
>>> a is b
True
>>> 3-2 is a
True

That happens because CPython (a particular and very common implementation of 
Python) pre-creates objects for all small integers (something like <=100).  
This saves memory, because all values of '1' are the same!  So the 
literal '1' simply gets a reference to the existing object of value '1', 
rather than creating a new one (like the literal '500' does).  The same is 
also true for strings with len<=1.






More information about the Python-list mailing list