A question on modification of a list via a function invocation

Antoon Pardon antoon.pardon at vub.be
Fri Sep 8 10:21:32 EDT 2017


Op 08-09-17 om 04:09 schreef Steve D'Aprano:
> On Fri, 8 Sep 2017 04:24 am, Rustom Mody wrote:
>
>> On Thursday, September 7, 2017 at 6:52:04 PM UTC+5:30, Gregory Ewing wrote:
>>> Rustom Mody wrote:
>>>
>>>> I said: In that case please restate the definition of 'is' from the manual
>>>> which invokes the notion of 'memory' without bringing in memory.
>>> I don't know whether it's in the manual, but at least for
>>> mutable objects, there is a way to define the notion of
>>> "same object" that doesn't require talking about "memory":
>>>
>>> Two names refer to the same object if and only if mutations
>>> made through one are visible through the other.
>> Seems a sensible comment!
>
> Except that it is wrong, or at least over-generalised. It is trivially easy to
> show false positives:
>
> py> class K: # defines an object
> ...     def __init__(self, x):
> ...             self.x = x
> ...     def append(self, value):
> ...             self.x.append(value)
> ...
> py> a = []
> py> b = K(a)
> py> a is b  # these are not the same object (they're different types)
> False
> py> b.append(99)  # but modifying b modifies a
> py> a
> [99]

I don't know if this is a False positive. Yes you have shown a mutation
to one that also shows up in the other. But it is possible to mutate b
in ways that doesn't show up in a.

It seems you have interpreted the phrase: "if and only if mutations
made through one are visible through the other." as if it said: 
"if and only if *some* mutations made through one are visible through
the other." while it seems more natural to me to understand it as:
"if and only if *all* mutations made through one are visible through
the other."

So since it is possible to mutate b in ways that are not reflected in
a, I can't really see this as a false positive.

-- 
Antoon Pardon 




More information about the Python-list mailing list