git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

I'm wrong or Will we fix the ducks limp?


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