On Monday, August 6, 2012 12:50:13 PM UTC-7, Mok-Kong Shen wrote:
> I ran the following code:
> 
> 
> 
> def xx(nlist):
> 
>    print("begin: ",nlist)
> 
>    nlist+=[999]
> 
>    print("middle:",nlist)
> 
>    nlist=nlist[:-1]
> 
>    print("final: ",nlist)
> 
> 
> 
> u=[1,2,3,4]
> 
> print(u)
> 
> xx(u)
> 
> print(u)
> 
> 
> 
> and obtained the following result:
> 
> 
> 
> [1, 2, 3, 4]
> 
> begin:  [1, 2, 3, 4]
> 
> middle: [1, 2, 3, 4, 999]
> 
> final:  [1, 2, 3, 4]
> 
> [1, 2, 3, 4, 999]
> 
> 
> 
> As beginner I couldn't understand why the last line wasn't [1, 2, 3, 4].
> 
> Could someone kindly help?
> 
> 
> 
> M. K. Shen

When you pass a list (mutable object) to a function, the pointer to the list is 
passed to the function and the corresponding argument points to the same memory 
location as the pointer passed in. So in this case, nlist points to the same 
memory location which u points to when xx is called,  i.e. nlist and u points 
to same memory location which contains [1,2,3,4].

nlist += [999]  is equivalent to nlist.extend([999]). This statement adds the 
argument list to the original list, i.e. the memory location pointed by nlist  
and u now contains [1,2,3,4,999]. So, print(u) after calling xx will print 
[1,2,3,4,999].

 nlist += [999] is not the same as nlist = nlist + [999]. In the later case, 
nlist + [999] will create a new memory location containing the two lists 
combined and rebind nlist to the new location, i.e. nlist  points to a new 
memory location that has [1,2,3,4,999]. So if nlist = nlist +[999] is used, the 
original memory location containing [1,2,3,4] is untouched, and print(u) after 
calling xx will print [1,2,3,4]
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to