why cannot assign to function call

Mark Wooding mdw at distorted.org.uk
Sat Jan 10 21:41:17 EST 2009


Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au> wrote:

> There are actually three fundamental characteristics of pass-by-reference:
> 
> * passing a value by reference does not lead to the value being copied, 
> in contrast with pass-by-value where it does;
> 
> * modifications to the value passed by reference are visible to the 
> caller;
> 
> * assignments to the value passed by reference are visible to the
>   caller.

I've given an extensive definition of pass-by-reference.  Distilling and
paraphrasing, the main characteristic is that (where possible) new
variables are not created: rather, the parameter names are bound to the
caller's variables.  All three of your above characteristics are
consequences of this one.

But your definition is also flawed: it doesn't distinguish pass-by-
reference from pass-by-value/return (where the caller's variable is
updated from the function parameter's final value when the function
returns).  The difference is detectable if you use global variables,
however:

  variable g = 1

  function foo(x):
    x = 2
    print g

  foo(g)
  print g

prints 1 and 1 if you use pass-by-value, 2 and 2 if you use pass-by-
reference, and 1 and 2 if you use pass-by-value/result.

(Within the framework I presented elsewhere, pass-by-value/result is
like pass-by-value, except that we update:

  s'''' = s'''[s'''(e''(n))/l]

where s''' is the store just prior to the return, s'''' is the store
just after the return, n is the parameter name, e'' is the function's
environment, and l is the location designated by the argument
expression, i.e., (l, s') = loc(x, e, s).  If there is no such location,
then the language may either fail to compile the call, or omit the
update operation.)

> Pascal VAR parameters have all three characteristics.

That's because they work as I've suggested.

> Pascal non-VAR parameters have none of them.

Indeed.

> Python parameters have two of the three. C parameters (call-by-value)
> have none of them, except for arrays, where they have all three,
> making arrays in C behave just like Pascal pass-by- reference VAR
> parameters.

Rubbish.  In C:

  void foo(char v[42]) { v = 0; }

Calling this function has no effect on the caller whatsoever.  I've
already explained C arrays, with reference to the ISO standard,
exhaustively: there should be no excuse for continued misunderstanding
of this point.

-- [mdw]



More information about the Python-list mailing list