En Python, un valor x
no siempre está limitado a igualarse a sí mismo. Quizás el ejemplo más conocido sea NaN
:
>>> x = float("NaN") >>> x == x False
Ahora considere una lista de exactamente un elemento. Podríamos considerar que dos de estas listas son iguales si y solo los elementos que contienen son iguales . Por ejemplo:
>>> ["hello"] == ["hello"] True
Pero este no parece ser el caso con NaN
:
>>> x = float("NaN") >>> x == x False >>> [x] == [x] True
Así que estas listas de elementos que son “no iguales”, son “iguales”. Pero solo a veces … en particular:
NaN
se consideran iguales; mientras NaN
no son iguales Observar:
>>> x = float("NaN") >>> [x] == [x] True >>> [x] == [float("NaN")] False
Este comportamiento general también se aplica a otros tipos de colecciones, como tuplas y conjuntos. ¿Hay una buena razón para esto?
Por los documentos ,
Al aplicar la reflexividad de los elementos, la comparación de colecciones supone que para un elemento de colección x, x == x siempre es cierto . Sobre la base de ese supuesto, la identidad del elemento se compara primero y la comparación de elementos se realiza solo para elementos distintos. Este enfoque produce el mismo resultado que lo haría una comparación estricta de elementos, si los elementos comparados son reflexivos. Para los elementos no reflexivos, el resultado es diferente al de la comparación estricta de elementos, y puede ser sorprendente: los valores no reflexivos no reflexivos, por ejemplo, dan como resultado el siguiente comportamiento de comparación cuando se utilizan en una lista:
>>> nan = float('NaN') >>> nan is nan True >>> nan == nan False <-- the defined non-reflexive behavior of NaN >>> [nan] == [nan] True <-- list enforces reflexivity and tests identity first