<html>
<body>
Hi John,<br><br>
I think what we all agree on is the details of what is happening in
Python.&nbsp; As long as we use unambiguous words to describe that
process, there is no problem.&nbsp; The problem is in the definition of
&quot;call-by-value&quot;.&nbsp; I have offered a simple definition, what
I called the &quot;traditional&quot; definition, but perhaps that is
claiming too much priority for one tradition.&nbsp; I'll call it the
&quot;common&quot; definition, what most programmers will tell you, and
what you find at
<a href="http://en.wikipedia.org/wiki/Call_by_value" eudora="autourl">http://en.wikipedia.org/wiki/Call_by_value</a><br><br>
I know this discussion is getting very old, but I would like to get just
one thing resolved.&nbsp; Can you give us clear and concise definitions
of call-by-value and call-by-reference?<br><br>
At 03:59 PM 5/20/2008 -0500, John Zelle wrote:<br><br>
<blockquote type=cite class=cite cite>Hi David,<br><br>
It's enough for me at this point that we all agree on what we're
talking<br>
about. The rest is a matter of &quot;taste,&quot; I think. The one real
sticking<br>
point I still have with your approach is simply that what you
&quot;expect&quot;<br>
pass-by-value to do in Python (namely make a copy of the object that
a<br>
variable refers to) is not to my knowledge implemented in any
language.</blockquote><br>
C does call-by-value, at least with primitive objects (according to
Kernighan and Ritchie).<br><br>
<blockquote type=cite class=cite cite>Lots of languages have been built
around &quot;pass-by-value,&quot; and none is<br>
doing what you consider your acid-test for pass-by value. On the
flip<br>
side, any language that claims pass-by-reference as part of the
language<br>
allows me to do what I consider the acid test for pass-by-reference<br>
(namely I can change the referent of the calling argument), which I<br>
cannot do in Python.</blockquote><br>
I assume by &quot;change&quot; you mean &quot;re-bind&quot;, and by
&quot;referent&quot; you mean &quot;object&quot;.&nbsp; It is possible to
modify the object of the calling argument.<br><br>
<blockquote type=cite class=cite cite>&nbsp;So I prefer to use the terms
the way they have been<br>
used historically and remain consistent with language design<br>
traditions.</blockquote><br>
I'm finding it hard to understand your terms, perhaps because I'm not
familiar with the traditions you refer to.&nbsp; It would really help if
we could use the same words for simple things we all understand.&nbsp;
Here are my suggestions. 
<dl>
<dd>variable:(name, pointer) --&gt; object:(type, value, address) 
<dd>re-bind a variable 
<dd>modify an object 
<dd>copy a pointer 
</dl>-- Dave<br><br>
<br>
<blockquote type=cite class=cite cite>On Tue, 2008-05-20 at 10:29 -0700,
David MacQuigg wrote:<br>
&gt; Hi John,<br>
&gt; <br>
&gt; I did some more searching on this question, and I see it has been
discussed many times before.&nbsp; I read a few of the threads, and they
seem to go on forever with no resolution, just a lack of
communication.&nbsp; It comes down to the definition of
&quot;value&quot;.&nbsp; One camp says a value is only the actual data in
an object, the other says the value can be the reference.&nbsp; I've been
using it to mean only the data.<br>
&gt; <br>
&gt;&nbsp;&nbsp;&nbsp; variable:(name, pointer) --&gt; object:(type,
value, address)<br>
&gt; <br>
&gt; Looks like this controversy is not just in the Python
community.&nbsp; I found a good discussion in Bruce Eckel's Thinking in
Java, 2nd ed, Appendix A: Passing and Returning Objects.&nbsp; On p.
1018, he has a discussion of pass-by-value with a nice summary of the
views of &quot;two distinct camps&quot;.&nbsp; He concludes with &quot;I
will attempt to sidestep the issue.&nbsp; In the end, it isn't that
important.&nbsp; What is important is that you understand that passing a
reference allows the caller's object to be changed
unexpectedly.&quot;<br>
&gt; <br>
&gt; I think that is what we need to focus on.&nbsp; What will students
remember in later years?&nbsp; Which explanation will be most beneficial
in helping them avoid problems?<br>
&gt; <br>
&gt; I hope that you will recognize the validity of other views, and not
just say they are wrong.&nbsp; I think that is the only way this
discussion can move forward.<br>
&gt; <br>
&gt; I wrote a detailed response to your last post, but decided to delete
most of it.&nbsp; I'll just leave a few parts where I need to correct a
serious misunderstanding of what I am saying.<br>
&gt; <br>
&gt; At 06:36 PM 5/19/2008 -0500, John Zelle wrote:<br>
&gt; <br>
&gt; &gt;You insist on writing/thinking/reasoning as if Python
variables<br>
&gt; &gt;&quot;contain&quot; the objects they refer to, but that simply
is not the case for<br>
&gt; &gt;the traditional use of the term &quot;variable.&quot;<br>
&gt; <br>
&gt; That is not at all what I meant.&nbsp; In my model the variable has
only a name and a pointer.&nbsp; The variable refers to an object, but it
does not &quot;contain&quot; the object, in the sense that a variable in
C is like a box containing a value.<br>
&gt; <br>
&gt;&nbsp;&nbsp;&nbsp; variable:(name, pointer) --&gt; object:(type,
value, address)<br>
&gt; <br>
&gt; &gt; Literally, your model,<br>
&gt; &gt;with the traditional definition would require that every
assignment<br>
&gt; &gt;statement in Python create a new variable. Consider this
sequence:<br>
&gt; &gt;<br>
&gt; &gt;a = 3 # creates the variable &quot;a&quot;<br>
&gt; &gt;a = 4 # &quot;a&quot; is now bound to another location<br>
&gt; &gt;a = 5 # &quot;a&quot; is now bound to yet another location<br>
&gt; &gt;<br>
&gt; &gt;Since the address of the value changes with each assignment, the
pair<br>
&gt; &gt;(name, location) is changing each time, and hence we have here
three<br>
&gt; &gt;different variables with the same name. That's certainly not the
way I<br>
&gt; &gt;think about what's happening in Python!<br>
&gt; <br>
&gt; In my model, the pointer associated with the variable named
&quot;a&quot; is moved from one object to the next, leaving the old
object for the garbage collector.<br>
&gt; <br>
&gt; &gt;So, my question is why don't we just stick with the traditional
notion<br>
&gt; &gt;of a variable being a (name, location) pair.<br>
&gt; <br>
&gt; I've been calling it a (name, pointer) meaning the same thing.<br>
&gt; <br>
&gt; &gt; Realize that Python<br>
&gt; &gt;dereferences the values for us when we use variables in
expressions and<br>
&gt; &gt;stop trying to invent new names for a parameter passing
mechanism that<br>
&gt; &gt;is identical in function to traditional call by value.<br>
&gt; <br>
&gt; We seem to be coming from different traditions.&nbsp; In my
tradition, call-by-value means copying the actual data to the function,
and call-by-reference means copying a reference (pointer).&nbsp; These
definitions include all possibilities, and lead to simple inferences
about safety and efficiency, which is the only benefit I can see for
discussing the topic with students who are nowhere near being language
theory specialists.&nbsp; The message to my students will be simple -
It's like call by reference in C - efficient, but watch out for functions
that might modify the objects you send as arguments.<br>
&gt; <br>
&gt; The alternative - like call by value but ... seems a lot more
difficult to explain.<br>
&gt; ... but it is efficient, because the &quot;values&quot; being passed
are really just pointers.<br>
&gt; ... but it is not safe, because the function can modify the caller's
arguments.<br>
&gt; <br>
&gt; When I first learned Python, four years ago, I found the discussion
in Martelli's book on call-by-value to be confusing, so much so that it
impeded my understanding of the simple mechanism that it really is.&nbsp;
This confusion was not resolved until last week when I started
researching this question, in response to a student's question in
class.&nbsp; I believe that telling students of C that Python is
&quot;call by value&quot; will generate the same confusion that I
suffered.&nbsp; No amount of explanation, or re-assurance &quot;this is
what some experts say&quot; will help.<br>
&gt; <br>
&gt; The examples and diagrams in your section 6.5.2 are excellent.&nbsp;
Just for fun, I re-wrote that section keeping everything the same, but
changing only the few paragraphs where you talk about
call-by-value.&nbsp; In my humble opinion, that section is shorter and
much more clear from a &quot;call-by-reference&quot; point of view.&nbsp;
It avoids having to say that the &quot;values&quot; of variables are
actually the pointers, not the data.&nbsp; It avoids introducing more
complex definitions (e.g. &quot;call-by-reference&quot; means that
assigning a value to a formal parameter changes the value in the calling
program.&nbsp; That's a result, not a definition, and the result depends
on unrelated details of the language, like re-binding semantics.)&nbsp;
It avoids the awkward &quot;Isn't that interesting?&quot; paragraph where
you have to explain that in some cases you really can change the caller's
object after it has been passed by value.<br>
&gt; <br>
&gt; I'm not saying your definitions are wrong, I just don't see the
benefits of adopting these more difficult and more specialized
definitions.&nbsp; Being consistent with some language theorists is not a
benefit if it confuses students.<br>
&gt; <br>
&gt; -- Dave</blockquote></body>
</html>