Now that's a splendid example.

The previous Guy-Amit discussion was on a somewhat higher level (not
actually relating to the specific ongoing course), but surely when teaching
the kids it's better to use this kind of examples.

R.

-----Original Message-----
From: Nir Soffer [mailto:[EMAIL PROTECTED] 
Sent: Sunday, December 04, 2005 3:58 AM
To: RaeNye
Cc: Python User Group
Subject: Re: teaching python variables


On 4 Dec, 2005, at 2:09, RaeNye wrote:

>> Why use this strange name "mlist_a"? Instead use:
>> multiple_lists = [list1, list2]
>
> I don't see a problem with Guy's name selection. I consider your 
> suggestion worse, as the object called "multiple_lists" is, in fact, a 
> single list that contains two other lists. You might call the outer 
> list "nested_list"
> or
> "outer_list", but "multiple_lists" has nothing to do with the object 
> itself.

"lists" will be a better name. But why the names in this code are so lousy?
because its not a concrete example, its too abstract. Using real life
examples can make everything more clear.

For example, bart simpson downloaded our first game, and lisa created a list
of scores for each family member:

 >>> lisa_scores = [90, 85, 80]
 >>> bart_scores = [50, 65]
 >>> homer_scores = [] # too stupid to play  >>> marge_scores = [] # too
busy

# Lets keep all the scores in one list
 >>> simpsons_scores[lisa_scores, bart_scores, homer_scores, marge_scores]

Now we can ask questions about it:

What were lisa scores?
 >>> simpsons_scores[0]
[90, 85, 80]
 >>> lisa_scores
[90, 85, 80]

they look equal...
 >>> simpsons_scores[0] == lisa_scores
True

They are.

Is it the same list of a copy?
 >>> simpsons_scores[0] is lisa_scores
True

This answer the question, what happens when you do list = [foo, bar] - you
create reference to the objects.

homer and marge have both empty list. They must be equal:
 >>> homer_scores == marge_scores
True

But they are not the same list:
 >>> homer_scores is marge_scores
False

lisa teach homer to play, and add some scores:
 >>> homer_scores.append(10)

the simpsons_scores list updated:
 >>> simpsons_scores
[[90, 85, 80], [50, 65], [10], []]

homer_scores and simpsons_scores[2] reference the same list object (which
Python manage for us somewhere in the memory)

homer tries again, made some improvement:
 >>> homer_scores.append(11)
 >>> simpsons_scores
[[90, 85, 80], [50, 65], [10, 11], []]

bart is not happy with lisa results:
 >>> del lisa_scores
 >>> lisa_scores
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
NameError: name 'lisa_scores' is not defined

That was evil!

 >>> simpsons_scores
[[90, 85, 80], [50, 65], [10, 11], []]

F**k! they are still there!? hmm, lisa_scores was not the list, its only a
name, the list is still there. This is exactly what Python told us just now:
"NameError: name 'lisa_scores' is not defined".

lisa fixes the situation
 >>> lisa_scores = simpsons_scores[0]
 >>> lisa_scores
[90, 85, 80]

Now [[90, 85, 80], [50, 65], [10, 11], []] is a lousy way to keep this kind
of data, because we have to remember the order of the family members. This
leads naturally to dicts - because we need it NOW to write simpler and more
readable code.


I hope it helps, It was fun to write :-)


Best Regards,

Nir Soffer

לענות