Re: A difficulty with lists
On Monday, August 6, 2012 3:50:13 PM UTC-4, 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
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. If you wanted the last line to be [1,
2, 3, 4], you could use the code below:
#BEGIN CODE
def xx(nlist):
print("begin: ",nlist)
nlist+=[999]
print("middle:",nlist)
nlist=nlist[:-1]
print("final: ",nlist)
return nlist
u=[1,2,3,4]
print(u)
u = xx(u)
print(u)
#END CODE
Notice that I changed two things. First, the function xx(nlist) returns nlist.
Secondly, u is reassigned to the result of xx(nlist).
--
http://mail.python.org/mailman/listinfo/python-list
Re: A difficulty with lists
On Monday, August 6, 2012 3:50:13 PM UTC-4, 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
I've modified your code slightly so you can see what's happening with u in the
middle of function xx. Take a look:
u=[1,2,3,4]
def xx(nlist):
print("xx(u)\n")
print("At first, u and nlist refer to the same list")
print("nlist: %s u: %s\n" % (nlist, u))
nlist+=[999]
print("nlist+=[999]\n")
print("The list has been modified in place. u and nlist are still equal")
print("nlist: %s u: %s\n" %(nlist, u))
nlist=nlist[:-1]
print("nlist=nlist[:1]\n")
print("Now nlist refers to a new list object in memory that was created by")
print("taking a slice of u. u and nlist are no longer equal.")
print("nlist: %s u: %s" %(nlist, u))
xx(u)
Here's the output:
xx(u)
At first, u and nlist refer to the same list
nlist: [1, 2, 3, 4] u: [1, 2, 3, 4]
nlist+=[999]
The list has been modified in place. u and nlist are still equal
nlist: [1, 2, 3, 4, 999] u: [1, 2, 3, 4, 999]
nlist=nlist[:1]
Now nlist refers to a new list object in memory that was created by
taking a slice of u. u and nlist are no longer equal.
nlist: [1, 2, 3, 4] u: [1, 2, 3, 4, 999]
Thank you, Rob Day, for explaining a some of what's happening behind the scenes.
--
http://mail.python.org/mailman/listinfo/python-list
Re: A difficulty with lists
On Wednesday, August 15, 2012 8:21:22 PM UTC-4, Terry Reedy wrote: > On 8/15/2012 5:58 PM, Rob Day wrote: > > Yeah, my apologies for any confusion I created. Although I suppose my > explanation would be somewhat true for immutable objects since they can't be > modified in-place (any modification at all would cause the creation of a new > immutable object right?), I now understand that it is completely and totally > wrong for mutable objects. Thanks for the in-depth explanations, Terry and Rob. I feel like I have a much more solid grasp of what's going on behind the scenes after your analysis. > > > 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
Re: Top-posting &c. (was Re: [ANNC] pybotwar-0.8)
> And FWIW, I add my voice to those who prefer to read replies > > underneath the original text. Even if Mark were the only person vocal > > enough to complain, you can still rest assured that there are many > > more who agree. You've now heard from quite a few regular posters; > > there are probably several *hundred* lurkers who feel the same way, > > but do not post (possibly because they cannot). Also, these mails get > > archived all over the internet, so a generation not yet born can read > > and be either enlightened or irritated, as the case may be. > > > > ChrisA As a lurker, I agree completely with Chris's sentiments. -- http://mail.python.org/mailman/listinfo/python-list
