On 8/15/2012 5:58 PM, Rob Day wrote:

> Madison May wrote:
    The list nlist inside of function xx is not the same as the variable
    u outside of the function:  nlist and u refer to two separate list
    objects.  When you modify nlist, you are not modifying u.
    <http://mail.python.org/mailman/listinfo/python-list>

This is confused and wrong. The parameter *name* 'nlist' of function xx is not the same as the *name* 'u' outside the function. The call xx(u) binds nlist to the same object that u is bound to. At that point, the two name *are* bound to the same list object. The statement "nlist+=[999]" dodifying nlist *does* modify u. The subsequent assignment statement "nlist=nlist[:-1]" rebinds 'nlist' to a *new* list object. That new object gets deleted when the function returns. So the rebinding is completely useless.

This sequence, modifying the input argument and then rebinding to a new object, is bad code.

Well - that's not quite true. Before calling the function, u is [1, 2,
3, 4] - but after calling the function,  u is [1, 2, 3, 4, 999]. This is
a result of using 'nlist += [999]' - the same thing doesn't happen if
you use 'nlist = nlist+[999]' instead.

I'm not completely aware of what's going on behind the scenes here, but

you got it right.

I think the problem is that 'nlist' is actually a reference to a list
object - it points to the same place as u.

Calling a python function binds parameter names to argument objects or (for *args and **kwds parameters) a collection based on argument objects.

When you assign to it within
the function, then it becomes separate from u - which is why nlist =
nlist+[999] and nlist = nlist[:-1] don't modify u - but if you modify
nlist in place before doing that, such as by using +=, then it's still
pointing to u, and so u gets modified as well.


--
Terry Jan Reedy

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

Reply via email to