2012-04-21 7 views
8

me topé con esta línea de código en la fuente de SciPy, en el stats module:¿Es x == x alguna vez falso en Python?

return 1.0*(x==x) 

Es éste un resultado distinto del 1.0? En otras palabras, ¿hay algún valor de x tal que x == x tenga False?

+1

¿Qué es 'x' en esta instancia? ¿Implementa el método '__eq__'? ¿El retorno de ese método resulta en algo inesperado? Más contexto es probablemente necesario. –

+0

No estoy seguro de qué respuesta debo aceptar como correcta, porque a) Tanto la respuesta sobre 'NaN' como sobre el método' __eq__' tienen su punto yb) Me di cuenta * por qué * está este código allí: * es destinado a devolver una matriz llena de unidades del mismo tamaño que 'x' *. – astrojuanlu

+0

@NeilG dile a los desarrolladores de SciPy ... – astrojuanlu

Respuesta

22

De acuerdo con el estándar IEEE 754 not-a-number (NaN) siempre debe comparar falso, sin importar en qué se compara.

Python 2.7.2+ (default, Oct 4 2011, 20:06:09) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> x=float("NaN") 
>>> x==x 
False 
+0

Tienes razón, de hecho: >>> import numpy as np >>> np.nan == np.nan False – astrojuanlu

9

Un tipo definido por el usuario puede anular el operador de igualdad a hacer lo que quiera:

Python 3.2.2 (default, Feb 10 2012, 09:23:17) 
[GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class A: 
...  def __eq__(self, other): 
...   return False 
... 
>>> x=A() 
>>> x==x 
False 
3

que depende del valor de x. No he mirado en la fuente, pero digamos que haces algo como esto:

class A: 
def __eq__(self,other): 
    return bool(random.getrandbits(1)) 

x = A() 

ahora x == x puede devolver false.