Comparación de colecciones que contienen elementos no reflexivos.

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:

  • dos listas que consisten en la misma instancia de NaN se consideran iguales; mientras
  • dos listas separadas que consisten en diferentes instancias de 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