On 08/06/2016 12:01, Antoon Pardon wrote:
Op 08-06-16 om 12:33 schreef BartC:

But a 'proper' reference allows a complete replacement of what it
refers to. That would mean being able to do:

  B = "Cat"
  print A     # "Cat"

No tricks involving in-place updates such as assigning to list
elements are needed.

No it doesn't mean that. It means that if you mutate the object through one 
variable,
you can see the result of that mutation through the other variable. But if the
assignment doesn't mutate, you can't have such effect through assignment.

In python, you can sometimes simulate a mutating assignment and then we get 
this.

    >>> A = [8, 5, 3, 2]
    >>> B = A
    >>> B[:] = [3, 5, 8, 13]
    >>> A
    [3, 5, 8, 13]

Well, it then becomes necessary to separate a mutating assignment (a[i]=b) where the left-hand-size modifies part of a larger object, from a full assignment (a=b) which replaces a whole object (the value of a) with another.

So you have partial updates and full updates. A proper reference will be able to do both via the reference. Python can only do a partial update and the reason is that the reference points to the object, not the variable; there is no way to change the variable to link it with another, distinct object.

If the object is a list, then that can be modified to any extent, even replacing the contents completely, but it will still be a list. In the case of an int or string, then it's impossible to change. So there are limitations to what can be done.

Getting back to Pascal (as I /can/ remember how reference parameters work for integers), assigning to a reference integer parameter in a function will change the caller's version. Python can only emulate that by passing a one-element list or using some such trick. Affecting readability and, likely, performance.

--
Bartc
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to