Augument assignment versus regular assignment

Chris Lambacher chris at kateandchris.net
Sat Jul 8 15:36:34 EDT 2006


Looks like x=x+[2] creats a new list to me:
>>> b = [8,5,6]
>>> x = b
>>> x = x + [2]
>>> print b,x
[8, 5, 6] [8, 5, 6, 2]

-Chris
On Sat, Jul 08, 2006 at 11:56:11AM -0700, nagy wrote:
> Thanks, Kirk.
> I considered the += as only a shorthand notation for the assignment
> operator.
> Since for lists + is simply a concatetation, I am not sure it x=x+[2]
> is creating a brand
> new list. Could you refer me to any documentation on this?
> Thanks,
> Nagy
> Kirk McDonald wrote:
> > nagy wrote:
> > > I do the following. First create lists x,y,z. Then add an element to x
> > > using the augumented assignment operator. This causes all the other
> > > lists to be changed also.
> > > But if I use the assignment x=x+[4] instead of using the augumented
> > > assignment, the y and z lists do not change.
> > > Why is that?
> > > This does not happen when I work with integer data type for example, as
> > > shown below.
> > >
> > > Thanks for your help
> > > Nagy
> > >
> > >
> > >>>>x=y=z=[]
> >
> > In this example, the '[]' creates a new list object. x, y, and z are all
> > set to reference that object.
> >
> > >>>>x+=[2]
> >
> > This does an "in-place" operation on that list, modifying (or
> > "mutating") the object directly.
> >
> > >>>>x
> > >
> >
> > > [2]
> > >
> > >>>>y
> > >
> > > [2]
> > >
> > >>>>z
> > >
> > > [2]
> > >
> > >>>>x=x+[4]
> >
> > This creates a new list that is the concatenation of the list created
> > above (the list [2]) with a new list (the list [4]). This brand new list
> > is bound to the name 'x'. The names 'y' and 'z' are left unchanged. That
> > is, they still point to the original list.
> >
> > >>>>
> > >>>>x
> > >
> > > [2, 4]
> > >
> > >>>>y
> > >
> > > [2]
> > >
> > >>>>z
> > >
> > > [2]
> > >
> > >>>>a=b=4
> >
> > This binds the names 'a' and 'b' to the integer object 4.
> >
> > >>>>b
> > >
> > > 4
> > >
> > >>>>a+=2
> >
> > This attempts to mutate the integer object 4, by adding 2 to it.
> > However, numbers in Python are immutable, and so the in-place operation
> > fails. Thus, it creates a new integer object equal to 6 (actually,
> > CPython keeps a cache of certain smaller integer objects and reuses
> > them, but this does not matter in practice). This new integer object is
> > bound to the name 'a'. The name 'b' remains bound to the original 4 object.
> > 
> > >>>>a
> > > 
> > > 6
> > > 
> > >>>>b
> > > 
> > > 4
> > >
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list



More information about the Python-list mailing list