Re: A difficulty with lists

2012-08-15 Thread Madison May
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

2012-08-15 Thread Madison May
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

2012-08-16 Thread Madison May
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)

2012-08-16 Thread Madison May

> 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