[Tutor] Implementation of list comparison operators

Peter Otten __peter__ at web.de
Thu Jan 17 17:13:31 EST 2019


David Rock wrote:

> 
>> On Jan 17, 2019, at 13:40, Peter Otten <__peter__ at web.de> wrote:
>> 
>> David Rock wrote:
>> 
>>> 
>>> Isn’t this a bit artificial, though?  The reason this is False is
>>> because
>>> you explicitly tell it to return False when using equality.  That’s not
>>> the same thing as using __eq__ without overriding it’s behavior
>>> internally.
>> 
>> Sorry, I don't understand that argument. My point wasn't whether it's a
>> good idea to write objects that compare unequal to themselves -- such
>> objects already exist:
>> 
>>>>> nan = float("nan")
>>>>> nan == nan
>> False
>> 
>> I only warned that a list containing such an object does not meet the
>> intuitive expectation that list_a == list_b implies that all items in
>> list_a compare equal to the respective items in list_b.
> 
> It’s certainly a valid warning.  My confusion came from you using an
> arbitrary example of creating a class that breaks the logic in an override
> rather than one that already exists as a concrete example.  To me, your
> class example looked contrived.
> 
> What is it about the float(“nan”) example that makes this break?
> 
> In [5]: nan = float("nan”)
> 
> In [6]: type(nan)
> Out[6]: float
> 
> In [7]: nan == nan
> Out[7]: False
> 
> In [8]: a = 1.1
> 
> In [9]: a ==a
> Out[9]: True
> 
> In [10]: type(a)
> Out[10]: float
> 
> both a and nan are floats, so why does a == a work, but nan == nan
> doesn’t?

It does "work", it's only produces a result you didn't expect ;) 
Python just follows the standard here

https://en.wikipedia.org/wiki/IEEE_754
https://en.wikipedia.org/wiki/NaN#Comparison_with_NaN

Also:

https://stackoverflow.com/questions/10034149/why-is-nan-not-equal-to-nan




More information about the Tutor mailing list