I would argue that from a "functional" point of view (black box, the way it 
behaves), Python does behave like call-by-reference, for mutable types.

In another language, if I use call-by-reference, and the function modifies the 
variable, the caller's variable changes.  That's the same behavior I get in 
Python with mutable types (just as in John Posner's example).

I understand that it is not truly call-by-reference.  But from the outside, 
that's what it looks like, for mutable types.  For immutable types it looks 
like call-by-value, since changing it in the function does not change the 
caller's "copy" 

I definitely agree that Python is the best choice for a first language.  But 
there is this one inconsistency (or maybe call it a duality) of mutable vs 
immutable types, that I think can be a bit confusing.

Putting aside the "pass-by-X" question, a beginner asks:

"If I  do    A = (something)   then   B = A    then I change A, does B also 
change?"

And the answer, again, is "It depends."  For mutable types, yes, for immutable 
types, no.  And that's a sticky thing to get into for a beginner who is just 
learning what variables (names) are about. 

>>> a = 5
>>> b = a
>>> a
5
>>> b
5
>>> a = 7
>>> a
7
>>> b
5

>>> a = [8]
>>> b = a
>>> a
[8]
>>> b
[8]
>>> a.append(9)
>>> a
[8, 9]
>>> b
[8, 9]

I know that in the first case, you are not really "changing" a, you are 
attaching the name 'a' to a new object (7, instead of 5).  But that's not what 
it looks like from the outside.  It looks like you are changing a, and b is not 
changing.  In the second case, you are changing a, and b is changing.

I'm not saying the memory model is inconsistent, just that it can appear that 
way to a beginner.  And I think that's true whether they have had exposure to 
another language or not.

Respectfully,
Warren Sande


----- Original Message ----
From: John Zelle <[EMAIL PROTECTED]>
To: Warren Sande <[EMAIL PROTECTED]>
Cc: edu-sig@python.org
Sent: Tuesday, May 20, 2008 1:49:56 PM
Subject: Re: [Edu-sig] Pass by Reference

Hi All,

OK, really, this is my last post (on this topic).

On Tue, 2008-05-20 at 08:59 -0700, Warren Sande wrote:
> Agreed.  
> 
> Python "behaves like"  call-by-value for immutable types and  "behaves
> like" call-by-reference for mutable types.  Newbies care about how a
> thing behaves, not what's going on behind the scenes.

This is not really an accurate characterization. As I explained in my
previous post, Python never behaves like call-by-reference. Python
always and everywhere (not just in parameter passing) behaves like a
language where variables store references to objects (and happens to
use call-by-value for parameters). I agree that newbies need not even be
engaged in the terminology discussion.

>   Because understanding the behavior lets them write working programs.
> This seemingly inconsistent behavior is one thing that makes teaching
> with Python a bit more difficult.

Here I can't agree at all. The beauty of Python for newbies is that it
offers you one consistent memory model for assignment, parameter
passing, and everything else. This makes it unlike many other languages
that have multiple, often confusingly different mechanisms. I find it
much better as a first language.

>   Beginners want the answer to the question:  "If I pass something to
> a function, can the function change it or not?"  And the answer is,
> "It depends."  That's not a great answer for a beginner.

But again, this has nothing to do with functions AT ALL. The answer to
the question of "can I change it?" Is always and everywhere in Python:
"You can if it's a changeable (mutable) object." This has very little to
do with parameter passing. I'm more and more convinced this is only a
confusion for those of us who cut their teeth with languages that employ
other memory models. Of course, there's no need to confuse (true)
beginners with those other models. They'll only be confused if we
present a confusing picture.

If you're teaching (or writing for) students who might have already
encountered some other languages, then there's some explaining and
comparison to do. But the thing that needs to be explained is that all
"values" are heap-allocated objects, and variables _always_ contain a
reference to one of these. Again, don't confuse this important and cool
difference with notions about how parameters are passed. 

--John
> 
> 
> ----- Original Message ----
> From: John Posner <[EMAIL PROTECTED]>
> To: edu-sig@python.org
> Sent: Tuesday, May 20, 2008 10:50:38 AM
> Subject: Re: [Edu-sig] Pass by Reference
> 
> > ... and stop trying to invent new names for a parameter passing
> mechanism
> > that is identical in function to traditional call by value.
> > 
> 
> Yeah, but ... it will be difficult to stick to a call-by-value
> characterization when confronted with this example, which is straight
> from
> "Call by Reference 101":
> 
> def AddArtist(mylist):
>     mylist.append('TheOtherTerry')
> 
> >>> troupe
> ['Graham', 'John', 'Eric', 'Michael', 'Terry']
> 
> >>> AddArtist(troupe)
> 
> >>> troupe
> ['Graham', 'John', 'Eric', 'Michael', 'Terry', 'TheOtherTerry']
> 
> 
> Most students (especially newbies) won't care about what happens under
> the
> hood -- not at first. If it looks like a duck, walks like a duck, and
> quacks
> like a duck ...
> 
> -John
> 
> _______________________________________________
> Edu-sig mailing list
> Edu-sig@python.org
> http://mail.python.org/mailman/listinfo/edu-sig
> 
> 
> 
> _______________________________________________
> Edu-sig mailing list
> Edu-sig@python.org
> http://mail.python.org/mailman/listinfo/edu-sig
-- 
John M. Zelle, Ph.D.             Wartburg College
Professor of Computer Science    Waverly, IA     
[EMAIL PROTECTED]          (319) 352-8360  




_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to