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