es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el objeto float se comporta de manera diferente con el operador “is”?

Hasta donde sé, la implementación de cpython mantiene el mismo objeto para algunos valores iguales con el fin de ahorrar memoria. Por ejemplo, cuando creo 2 cadenas con el valor “hello”, cpython no crea 2 objetos ‘PyObject’ diferentes:

>>> s1 = 'hello'
>>> s2 = 'hello'
>>> s1 is s2
True

He oído hablar de esto con el nombre de “string interning”. Cuando intenté verificarlo con otros tipos de Python, observé que casi todos los tipos hashables (inmutables) son iguales:

>>> int() is int()
True
>>> str() is str()
True
>>> frozenset() is frozenset()
True
>>> bool() is bool()
True

Y casi todos los tipos mutables son lo opuesto (cpython crea un nuevo ‘PyObject’ incluso para los mismos valores):

>>> list() is list()
False
>>> set() is set()
False
>>> dict() is dict()
False

Y creo que es porque podemos tener el mismo ‘PyObject’ para objetos inmutables sin tener ningún problema.

Mi pregunta surge cuando veo que el tipo ‘float’ se comporta de manera diferente a otros tipos inmutables:

>>> float() is float()
False

¿Por qué es diferente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que los objetos float() se comportan de manera diferente a otros tipos inmutables en cpython se debe a su implementación. A diferencia de otros tipos inmutables, los objetos float() no se internan en cpython. Esto se debe a los posibles problemas de precisión asociados con los valores de punto flotante.

    La internación de valores de punto flotante podría llevar a errores sutiles que surgen de la precisión limitada de la aritmética de punto flotante. Por esta razón, cpython crea un nuevo PyObject incluso para el mismo valor de punto flotante. Por lo tanto, se recomienda comparar valores de punto flotante utilizando comprobaciones de igualdad aproximada en lugar de comprobaciones de identidad.

Comments are closed.